问题
是否有一种使用泛型参数模拟类的干净方法?假设我必须模拟一个类Foo<T>
,我需要传递给一个期望aFoo<Bar>
的方法。我可以很容易地做到以下几点:
Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
假设getValue()
返回通用类型T
。但是当我稍后将它传递给期望值为Foo<Bar>
的方法时,那将会有小猫。是铸造这样做的唯一方法吗?
#1 热门回答(209 赞)
另一种方法是使用@Mock
annotation。在所有情况下都不起作用,但看起来更性感:)
这是一个例子:
@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());