考虑以下代码:
public class DummyClass { public List<? extends Number> dummyMethod() { return new ArrayList<Integer>(); } } public class DummyClassTest { public void testMockitoWithGenerics() { DummyClass dummyClass = Mockito.mock(DummyClass.class); List<? extends Number> someList = new ArrayList<Integer>(); Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this } }
编译器抱怨正在尝试对行为进行存根的行dummyMethod()。关于如何使用存根方法返回带有有界通配符的类型的任何指针?
dummyMethod()
您也可以为此使用非类型安全方法doReturn,
@Test public void testMockitoWithGenerics() { DummyClass dummyClass = Mockito.mock(DummyClass.class); List<? extends Number> someList = new ArrayList<Integer>(); Mockito.doReturn(someList).when(dummyClass).dummyMethod(); Assert.assertEquals(someList, dummyClass.dummyMethod()); }
正如在Mockito的Google组中讨论的那样。
尽管它比thenAnswer起来简单,但再次请注意,它不是类型安全的。如果您担心类型安全,那么米尔豪斯的答案是正确的。
thenAnswer
要明确的是,这是观察到的编译器错误,
The method thenReturn(List<capture#1-of ? extends Number>) in the type OngoingStubbing<List<capture#1-of ? extends Number>> is not applicable for the arguments (List<capture#2-of ? extends Number>)
我相信编译器已在when调用期间分配了第一个通配符类型,然后无法确认调用中的第二个通配符类型thenReturn相同。
when
thenReturn
它看起来像thenAnswer没有碰到这个问题,因为它接受一个通配符类型,而thenReturn采取非通配符类型,它必须被捕获。从Mockito的OngoingStubbing中,
OngoingStubbing<T> thenAnswer(Answer<?> answer); OngoingStubbing<T> thenReturn(T value);