argThat
プラスラムダ
これが引数の検証に失敗する方法です。
verify(mock).mymethod(argThat(
(x)->false
));
どこ
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
argThat
プラスアサート
上記のテストは「言う」でしょうExpected: lambda$... Was: YourClass.toSting...
。ラムダでアサートを使用すると、より具体的な失敗の原因を取得できます。
verify(mock).mymethod(argThat( x -> {
assertThat(x).isNotNull();
assertThat(x.description).contains("KEY");
return true;
}));
ただし、これは1つのメソッド呼び出しでのみ機能します。検証されたメソッドが2回以上呼び出された場合、mockitoは呼び出されたすべての組み合わせを各検証者に渡します。そのため、mockitoは、検証者true
が引数セットの1つに対してサイレントに戻りfalse
、他の有効な呼び出しに対して(アサート例外なし)であることを期待します。その期待は、1つのメソッド呼び出しでは問題ではありません。1回だけtrueを返す必要があります。
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
今テストは言う:Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
。注:assertJ
アサーションを使用しましたが、どのアサーションフレームワークを使用するかはあなた次第です。
argThat
複数の引数を持ちます。
を使用する場合argThat
、すべての引数に一致を指定する必要があります。例えば:
verify(mock).mymethod(eq("VALUE_1"), argThat((x)->false));
// above is correct as eq() is also an argument matcher.
verify(mock).mymethod("VALUE_1", argThat((x)->false));
// above is incorrect; an exceptoin will be thrown, as the fist arg. is given without an argument matcher.
どこ:
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
eq
マッチャー
引数が等しいかどうかを確認する最も簡単な方法:
verify(mock).mymethod(eq(expectedValue));
// NOTE: ^ where the parentheses must be closed.
直接の議論
参照による比較が許容できる場合は、次に進みます。
verify(mock).mymethod(expectedArg);
// NOTE: ^ where the parentheses must be closed.
元の質問の失敗の根本原因は、括弧の間違った場所でした:verify(mock.mymethod...
。それは間違っていました。権利は:verify(mock).*