模拟用的Mockito
这里一般返回类型的方法是我的问题:模拟用的Mockito
public interface Containter extends ModelElement{
List<? extends ModelElement> getChildren();
}
有几类实现Containter,我想嘲笑他们:
public class MockMama {
public static <T extends Containter, Y extends ModelElement> T bornContainer(Class<T> clazz, Y ... children) {
T container = mock(clazz);
when(container.getChildren()).thenReturn(Arrays.asList(children));
return container;
}
}
但是这并未没有工作。 Eclipse说:“然后返回(List)类型的OngoingStubbing>方法不适用于参数(List)”。我也尝试传递类型List <? extends ModelElement>
的本地声明变量然后返回,但这也没有帮助。
任何帮助,高度赞赏和欢迎:)
您的问题是,不能保证getChildren()返回的类型与您的bornContainer方法的varargs参数的类型相匹配。所以编译器是正确的抱怨这一点。使用中间局部变量确实会将编译器错误转化为潜在的运行时问题。
在我看来,你的“Containter”实际上应该是一个泛型类,因为它的行为取决于getChildren()返回的列表中的类型。看看我重写你的例子。这没有编译错误或警告。
public interface Containter<Z extends ModelElement> extends ModelElement{
List<Z> getChildren();
}
public class MockMama {
public static <Y extends ModelElement, T extends Containter<Y>> T bornContainer(Class<T> clazz, Y ... children) {
T container = mock(clazz);
when(container.getChildren()).thenReturn(Arrays.asList(children));
return container;
}
}
希望这会有所帮助。
感谢您的回答。但Container实际上不能通用 - 它应该能够返回任何类型的ModelElements。另外我很抱歉,在这个问题上有一个错字 - 应该没有Z2ModelElements,所有的多面体只是ModelElements。所以这两个容器的getChildren和方法泛型都是Y extends ModelElement,为什么还要有额外的保证? – user656449 2011-12-26 10:37:16
由于'getChildren'返回的'Y'不一定匹配传入'bornContainer'的'Y';编译器正试图保护你免受你自己的伤害。然而,如果这些方法应该能够处理任何类型的'ModelElement',那么你可以完全放弃'Y' - 也就是说,'getChildren'的返回类型可以是'List
好的。我想我明白了。谢谢。 – user656449 2011-12-28 10:40:40
通常在测试中,你可以忽略未检查或原始类型的警告。所以使用编译器指令(如@SupressWarning("unchecked")
)来标注测试通常是安全的。
好吧,是的,它可以被压制,但我不明白为什么原始代码不能编译。这让我很紧张:)我觉得这是一种废话“你可以做x,除非在y的情况下,除非y做z,在这种情况下你可以如果...”Ken Arnold谈论http:// weblogs .java.net/blog/arnold/archive/2005/06/generics_consid.html – user656449 2011-12-23 12:55:51
好吧,它看起来可以通过引入额外的本地变量来修复,如 List list = Arrays.asList(children); when(container.getChildren())。thenReturn(list); 有没有办法做到这一点,而不会导致原始类型警告? – user656449 2011-12-23 12:29:31