Answers:
我认为您确实需要强制转换,但应该不会太糟:
Foo<Bar> mockFoo = (Foo<Bar>) mock(Foo.class);
when(mockFoo.getValue()).thenReturn(new Bar());
解决此问题的另一种方法是改用@Mock
注释。并非在所有情况下都有效,但看起来却更性感:)
这是一个例子:
@RunWith(MockitoJUnitRunner.class)
public class FooTests {
@Mock
public Foo<Bar> fooMock;
@Test
public void testFoo() {
when(fooMock.getValue()).thenReturn(new Bar());
}
}
在MockitoJUnitRunner
初始化带注释的字段@Mock
。
SuppressWarnings
。存在警告是有原因的,最好不要养成抑制它们的习惯。谢谢!
@Mock
代替的一件事mock()
:在构造期间字段仍然为null,因此我当时无法插入依赖项,也不能使字段成为最终字段。前者当然可以通过带@Before
注释的方法来解决。
您总是可以创建一个满足您要指定的通用类型的中间类/接口。例如,如果Foo是接口,则可以在测试类中创建以下接口。
private interface FooBar extends Foo<Bar>
{
}
在Foo 是非最终类的情况下,您可以使用以下代码扩展该类并执行相同的操作:
public class FooBar extends Foo<Bar>
{
}
然后,您可以使用以下代码使用以上任一示例:
Foo<Bar> mockFoo = mock(FooBar.class);
when(mockFoo.getValue()).thenReturn(new Bar());
Foo
一个接口或非最终类,这似乎是一个合理的解决方案。谢谢。
创建一个测试实用程序方法。如果您需要多次使用,则特别有用。
@Test
public void testMyTest() {
// ...
Foo<Bar> mockFooBar = mockFoo();
when(mockFooBar.getValue).thenReturn(new Bar());
Foo<Baz> mockFooBaz = mockFoo();
when(mockFooBaz.getValue).thenReturn(new Baz());
Foo<Qux> mockFooQux = mockFoo();
when(mockFooQux.getValue).thenReturn(new Qux());
// ...
}
@SuppressWarnings("unchecked") // still needed :( but just once :)
private <T> Foo<T> mockFoo() {
return mock(Foo.class);
}
static <T> T genericMock(Class<? super T> classToMock) { return (T)mock(classToMock); }
它甚至不需要任何抑制:)但是要小心,Integer num = genericMock(Number.class)
编译时会抛出异常ClassCastException
。这仅在最常见的G<P> mock = mock(G.class)
情况下有用。
我同意,一个人不应在类或方法中禁止显示警告,因为这样可能会忽略其他偶然被禁止的警告。但是恕我直言,禁止仅影响一行代码的警告是绝对合理的。
@SuppressWarnings("unchecked")
Foo<Bar> mockFoo = mock(Foo.class);
这是一个有趣的情况:方法接收通用集合并返回相同基本类型的通用集合。例如:
Collection<? extends Assertion> map(Collection<? extends Assertion> assertions);
可以结合使用Mockito anyCollectionOf匹配器和Answer来模拟此方法。
when(mockedObject.map(anyCollectionOf(Assertion.class))).thenAnswer(
new Answer<Collection<Assertion>>() {
@Override
public Collection<Assertion> answer(InvocationOnMock invocation) throws Throwable {
return new ArrayList<Assertion>();
}
});