web-dev-qa-db-ja.com

モックされたメソッドが初めて呼び出されたときにのみ例外をスローする方法は?

複数回呼び出せるモックオブジェクトのメソッドがあります(再帰を考えてください)。メソッドは次のように定義されています。

public void doCommit() { }

失敗するように伝えるために、この規則を使用します。

doThrow(new RuntimeException()).when(mMockedObject).doCommit();

ただし、これにより、メソッドが呼び出されるたびにこの例外がスローされます。たとえば、最初と3回目に呼び出されたときにのみスローされるようにするにはどうすればよいですか?つまり、たとえば、2回目と4回目は例外をスローせずに戻るだけです。私はdoCommit()の作成者ではなく、変更可能なソースコードも持っていないことに注意してください。

39
fnCzar

私はそれを理解しました(イゴールからのいくつかのヒント付き)。これは、連続したvoidメソッド呼び出しをスタブする方法です。

doThrow(new RuntimeException()).doNothing().doThrow(...).doNothing().when(mMockedObject).doCommit();

イゴールに感謝!

61
fnCzar

読み取り 連続呼び出しdoco を読むと、次のようなものがそれを行う可能性があります。

when(mMockedObject.doCommit())
  .thenThrow(new RuntimeException())
  .thenCallRealMethod() 
  .thenThrow(new RuntimeException())
  .thenCallRealMethod();

基本となるメソッドを実際に呼び出したくない場合は、 thenAnswer メソッドの代わりに thenCallRealMethod を使用し、空のスタブを提供する必要があります移住。

21
Igor Zevaka