Mockitoに関数の引数の値を取得させることができません。私は検索エンジンのインデックスをock笑していますが、インデックスを作成する代わりに、ハッシュを使用しています。
// Fake index for solr
Hashmap<Integer,Document> fakeIndex;
// Add a document 666 to the fakeIndex
SolrIndexReader reader = Mockito.mock(SolrIndexReader.class);
// Give the reader access to the fake index
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))
クエリの結果(つまり、返されるドキュメント)をテストしているため、任意の引数を使用できません。同様に、各ドキュメントに特定の値を指定したり、行を追加したりしたくありません!
Mockito.when(reader.document(0)).thenReturn(document(fakeIndex(0))
Mockito.when(reader.document(1)).thenReturn(document(fakeIndex(1))
....
Mockito.when(reader.document(n)).thenReturn(document(fakeIndex(n))
sing Mockito ページのコールバックセクションを見ました。残念ながら、これはJavaではありません。Javaで動作するための独自の解釈を得ることができませんでした。
編集(説明のため):引数Xをキャプチャして関数に渡すためにMockitoを取得するにはどうすればよいですか? Xの正確な値(またはref)が関数に渡されるようにします。
すべてのケースを列挙したくはありません。クエリごとに異なる結果をテストしているため、任意の引数は機能しません。
Mockitoページには
val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString }
それはJavaではなく、Javaに変換する方法や、発生したことを関数に渡す方法はわかりません。
私はMockitoを使ったことがありませんが、学びたいので、ここに行きます。私よりも無知な人が答えたら、まず答えを試してください!
Mockito.when(reader.document(anyInt())).thenAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
Object mock = invocation.getMock();
return document(fakeIndex((int)(Integer)args[0]));
}
});
ArgumentCaptorsを確認してください。
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/ArgumentCaptor.html
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
Mockito.when(reader.document(argument.capture())).thenAnswer(
new Answer() {
Object answer(InvocationOnMock invocation) {
return document(argument.getValue());
}
});
Verify()をArgumentCaptorと組み合わせて使用して、テストでの実行を保証し、ArgumentCaptorを使用して引数を評価することができます。
ArgumentCaptor<Document> argument = ArgumentCaptor.forClass(Document.class);
verify(reader).document(argument.capture());
assertEquals(*expected value here*, argument.getValue());
引数の値は、argument.getValue()を介して明らかにアクセス可能であり、さらに操作/確認したり、何でもしたいことができます。
Java 8の場合、これは次のようになります。
Mockito.when(reader.document(anyInt())).thenAnswer(
(InvocationOnMock invocation) -> document(invocation.getArguments()[0]));
document
はマップであると想定しています。