163

Mockito を使用して、以下の (簡略化された) コードをテストしたいと考えています。Mockito に 1 回目は失敗し、2 回目は成功するように指示する方法がわかりません。

for(int i = 1; i < 3; i++) {
  String ret = myMock.doTheCall();

  if("Success".equals(ret)) {
    log.write("success");
  } else if ( i < 3 ) {
    log.write("failed, but I'll try again. attempt: " + i);
  } else {
    throw new FailedThreeTimesException();
  }
}

次の方法で成功テストをセットアップできます。

Mockito.when(myMock).doTheCall().thenReturn("Success");

そして、失敗テストは次のとおりです。

Mockito.when(myMock).doTheCall().thenReturn("you failed");

しかし、1 回 (または 2 回) 失敗してから成功した場合、問題ないことをどのようにテストできますか?

4

6 に答える 6

308

ドキュメントから:

同じメソッド呼び出しに対して、異なる戻り値/例外でスタブする必要がある場合があります。典型的なユースケースは、イテレータのモックです。Mockito の元のバージョンには、単純なモッキングを促進するためのこの機能がありませんでした。たとえば、反復子の代わりに、Iterable または単にコレクションを使用できます。これらはスタブの自然な方法を提供します (たとえば、実際のコレクションを使用します)。ただし、まれなシナリオでは、連続した呼び出しをスタブ化すると便利な場合があります。

when(mock.someMethod("some arg"))
   .thenThrow(new RuntimeException())
  .thenReturn("foo");

//First call: throws runtime exception:
mock.someMethod("some arg");

//Second call: prints "foo"
System.out.println(mock.someMethod("some arg"));

したがって、あなたの場合、次のことが必要です。

when(myMock.doTheCall())
   .thenReturn("You failed")
   .thenReturn("Success");
于 2012-08-02T20:51:07.627 に答える
46

あなたが望むものを書くための最短の方法は

when(myMock.doTheCall()).thenReturn("Success", "you failed");

このように複数の引数をthenReturn指定すると、必要な回数だけ使用される最後の引数を除いて、各引数は多くても 1 回使用されます。たとえば、この場合、4 回コールすると、「成功」、「失敗しました」、「失敗しました」、「失敗しました」と表示されます。

于 2012-08-03T05:06:12.663 に答える