web-dev-qa-db-ja.com

Mockitoマッチャーはどのように機能しますか?

Mockito引数マッチャー(anyargThateqsameArgumentCaptor.capture()など)は、Hamcrestマッチャーとは非常に異なる動作をします。

  • Mockitoマッチャーは、マッチャーが使用されてからずっと後に実行されるコードであっても、InvalidUseOfMatchersExceptionを頻繁に発生させます。

  • Mockitoマッチャーは、特定のメソッドの1つの引数がマッチャーを使用する場合にのみ、すべての引数にMockitoマッチャーの使用を要求するなど、奇妙なルールに守られています。

  • Mockitoマッチャーは、Answersをオーバーライドするとき、または(Integer) any()などを使用するときにNullPointerExceptionを引き起こす可能性があります。

  • Mockitoマッチャーを使用して特定の方法でコードをリファクタリングすると、例外や予期しない動作が発生する可能性があり、完全に失敗する場合があります。

Mockitoマッチャーはなぜこのように設計され、どのように実装されていますか?

106
Jeff Bowman

私自身の問題の解決策を探しているときにこの質問を見つけたので、ジェフ・ボウマンの優れた答えへのほんの小さな追加です。

メソッドの呼び出しが複数のモックのwhenトレーニング済み呼び出しに一致する場合、when呼び出しの順序は重要であり、最も広いものから最も具体的なものの順にする必要があります。ジェフの例の1つから始めます。

when(foo.quux(anyInt(), anyInt())).thenReturn(true);
when(foo.quux(anyInt(), eq(5))).thenReturn(false);

は、(おそらく)望ましい結果を保証する順序です。

foo.quux(3 /*any int*/, 8 /*any other int than 5*/) //returns true
foo.quux(2 /*any int*/, 5) //returns false

When呼び出しを逆にすると、結果は常にtrueになります。

8
tibtof