私はFoo
の配列を期待するメソッドとのインタフェースを持っています。
public interface IBar {
void doStuff(Foo[] arr);
}
私はMockitoを使ってこのインターフェースをモックしています、そしてdoStuff()
が呼ばれることを主張したいのですが、どんな引数が渡されるのかを検証したくありません - "don't care"。
any()
の代わりにanyObject()
というジェネリックメソッドを使って次のコードを書くにはどうすればいいですか?
IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());
Java 8以降、引数なしのany
メソッドを使用でき、type引数はコンパイラによって推論されます。
verify(bar).doStuff(any());
Java 8の新機能は、式の ターゲット型 が、そのサブルーチンの型パラメータを推測するために使用されることです。式Java 8より前のバージョンでは、型パラメーターの推論に使用されるメソッドへの引数のみ(ほとんどの場合)。
この場合、パラメータ型doStuff
がany()
のターゲット型になり、戻り値の型any()
がその引数の型と一致するように選択されます。
残念ながら、これはプリミティブ型では動作しません。
public interface IBar {
void doPrimitiveStuff(int i);
}
verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead
問題は、コンパイラがInteger
をany()
の戻り値として推論することです。 Mockitoはこれを認識せず(型が消去されるため)、参照型のデフォルト値(null
)を返します。ランタイムは、戻り値をintValue
に渡す前にdoStuff
メソッドを呼び出すことによって、戻り値のボックス化を解除しようとしますが、例外がスローされます。
これはうまくいくはずです
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
verify(bar).DoStuff(any(Foo[].class));
そのためにMockito.isA()
を使うことができます。
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;
verify(bar).doStuff(isA(Foo[].class));
http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(Java.lang.Class)
私は最新のプロジェクトにこの機能を使う必要があったので(ある時点で1.10.19から更新しました)、ユーザーを維持するためだけに(既にmockito-coreバージョン2.1.0以降)を使用しています )最新では、上記の答えからの静的メソッドはArgumentMatchers
クラスから取られるべきです:
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;
バージョン3から始まる可能性があるため、モキートアーティファクトを最新の状態に維持することを計画している場合、このクラスはもう存在しない可能性があります。
2.1.0以降では、org.mockito.Matchersのjavadocは次のように述べています。
org.mockito.ArgumentMatchers
を使用してください。 Hamcrest *org.hamcrest.Matchers
クラスと名前が衝突しないように、このクラスは現在は非推奨です。このクラスはバージョン3.0で削除される予定です。