別のオプションは、古き良きファッションequals
方法に依存することです。長期に引数としてとしてwhen
モックequals
コード内の引数がテストされ、その後、Mockitoモックと一致します。
ここに例があります。
public class MyPojo {
public MyPojo( String someField ) {
this.someField = someField;
}
private String someField;
@Override
public boolean equals( Object o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
MyPojo myPojo = ( MyPojo ) o;
return someField.equals( myPojo.someField );
}
}
次に、値がどうなるかがわかっていると仮定してsomeField
、次のようにモックできます。
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
長所:これはany
マッチャーよりも明示的です。コードのレビュー担当者として、私はコードのany
初心者向けの開発者が書いているコードのロジックに目を通し、渡されている適切なオブジェクトを生成します。
con:オブジェクトに渡されるフィールドがランダムなIDである場合があります。この場合、モックコードで期待される引数オブジェクトを簡単に構築することはできません。
別の可能なアプローチはAnswer
、when
メソッドで使用できるMockitoのオブジェクトを使用することです。 Answer
実際の呼び出しをインターセプトして入力引数を検査し、モックオブジェクトを返すことができます。以下の例でany
は、モックされているメソッドへのリクエストをキャッチするために使用しています。しかし、Answer
ラムダで、Bazoの引数をさらに詳しく調べます。適切なIDが渡されたことを確認するためです。私はこれよりも、これを好むany
ので、少なくともいくつかの検査が議論に対して行われます。
Bar mockBar = //generate mock Bar.
when(fooDao.getBar(any(Bazo.class))
.thenAnswer( ( InvocationOnMock invocationOnMock) -> {
Bazo actualBazo = invocationOnMock.getArgument( 0 );
//inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
return mockBar;
} );
まとめると、私はequals
(期待される引数と実際の引数が互いに等しいはずである)に依存するのが好きで、(実際の引数の状態を予測できないため)等しいことが不可能な場合は、Answer
引数を検査します。