这是我的问题:
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 说 "OngoingStubbing> 类型中的方法 thenReturn(List( 不适用于参数 (List("。我还尝试将 List <? extends ModelElement>
类型的本地声明变量传递给 thenReturn,但这也没有帮助。
任何帮助都受到高度赞赏和欢迎:)
你的问题是,不能保证getChildren((返回的类型与varargs参数的类型与bornContainer方法相匹配。 所以编译器抱怨这一点是正确的。 使用中间局部变量实际上将编译器错误转变为潜在的运行时问题。
在我看来,你的"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;
}
}
希望这有帮助。
通常在测试中,您可以忽略未选中或原始类型的警告。因此,通常使用编译器指令(如 @SupressWarning("unchecked")
(对测试进行注释是安全的。