回答:
あなたはそれをキャストする必要があると思いますが、それは悪くないはずです:
Foo<Bar> mockFoo = (Foo<Bar>) mock(Foo.class);
when(mockFoo.getValue()).thenReturn(new Bar());
これを回避するもう1つの方法は、@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
代わりに使用したくない点が1つありmock()
ます。フィールドは構築時にnullのままであるため、そのときに依存関係を挿入できず、フィールドをfinalにすることができません。前者@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)
ケースでのみ役立ちます。
これは興味深いケースです。メソッドはジェネリックコレクションを受け取り、同じ基本型のジェネリックコレクションを返します。例えば:
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>();
}
});