一尘不染

Mockito:存根返回带界通配符的类型的存根方法

java

考虑以下代码:

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()。关于如何使用存根方法返回带有有界通配符的类型的任何指针?


阅读 224

收藏
2020-12-03

共1个答案

一尘不染

您也可以为此使用非类型安全方法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起来简单,但再次请注意,它不是类型安全的。如果您担心类型安全,那么米尔豪斯的答案是正确的。

额外细节

要明确的是,这是观察到的编译器错误,

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相同。

它看起来像thenAnswer没有碰到这个问题,因为它接受一个通配符类型,而thenReturn采取非通配符类型,它必须被捕获。从Mockito的OngoingStubbing中

OngoingStubbing<T> thenAnswer(Answer<?> answer);
OngoingStubbing<T> thenReturn(T value);
2020-12-03