1. ホーム
  2. java

[解決済み] 1回目の呼び出しが失敗し、2回目の呼び出しが成功した場合のシミュレーション

2022-04-25 19:59:47

質問

以下の(簡略化した)コードをMockitoを使ってテストしたいのですが、どうすればいいですか?一回目は失敗し、二回目に成功するようにMockitoに指示する方法がわかりません。

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回)失敗した後に成功すれば問題ないというテストはどのようにすればいいのでしょうか?

どのように解決するのですか?

から ドキュメント :

時には、同じメソッド呼び出しに対して異なる戻り値や例外を持つスタブが必要なことがあります。典型的な使用例としては、イテレータをモックすることです。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");