使用Mockito模拟具有泛型参数的类

问题

是否有一种使用泛型参数模拟类的干净方法?假设我必须模拟一个类Foo<T>,我需要传递给一个期望aFoo<Bar>的方法。我可以很容易地做到以下几点:

Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());

假设getValue()返回通用类型T。但是当我稍后将它传递给期望值为Foo<Bar>的方法时,那将会有小猫。是铸造这样做的唯一方法吗?


#1 热门回答(209 赞)

另一种方法是使用@Mockannotation。在所有情况下都不起作用,但看起来更性感:)

这是一个例子:

@RunWith(MockitoJUnitRunner.class)
public class FooTests {

    @Mock
    public Foo<Bar> fooMock;

    @Test
    public void testFoo() {
        when(fooMock.getValue()).thenReturn(new Bar());
    }
}

TheMockitoJUnitRunner初始化用@Mock注释的字段。


#2 热门回答(193 赞)

我认为你确实需要施展它,但它不应该太糟糕:

Foo<Bar> mockFoo = (Foo<Bar>) mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());

#3 热门回答(25 赞)

你始终可以创建一个中间类/接口,以满足你要指定的泛型类型。例如,如果Foo是一个接口,你可以在测试类中创建以下接口。

private interface FooBar extends Foo<Bar>
{
}

在Foo是a非finalclass的情况下,你可以使用以下代码扩展该类并执行相同的操作:

public class FooBar extends Foo<Bar>
{
}

然后,你可以使用以下代码使用上述任一示例:

Foo<Bar> mockFoo = mock(FooBar.class);
when(mockFoo.getValue()).thenReturn(new Bar());