web-dev-qa-db-ja.com

mockitoコールバックと引数値の取得

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に変換する方法や、発生したことを関数に渡す方法はわかりません。

68
nflacco

私は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]));
     }
 });
89
Ed Staub

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());
    }
  });
49
qualidafial

Verify()をArgumentCaptorと組み合わせて使用​​して、テストでの実行を保証し、ArgumentCaptorを使用して引数を評価することができます。

ArgumentCaptor<Document> argument = ArgumentCaptor.forClass(Document.class);
verify(reader).document(argument.capture());
assertEquals(*expected value here*, argument.getValue());

引数の値は、argument.getValue()を介して明らかにアクセス可能であり、さらに操作/確認したり、何でもしたいことができます。

26
fl0w

Java 8の場合、これは次のようになります。

Mockito.when(reader.document(anyInt())).thenAnswer(
  (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));

documentはマップであると想定しています。