Java 8以降では、引数なしのany
メソッドを使用でき、型引数はコンパイラーによって推論されます。
verify(bar).doStuff(any());
説明
Java 8の新しい点は、式のターゲットの型を使用して、そのサブ式の型パラメーターを推測することです。Java 8より前は、型パラメーターの推論に使用されるメソッドへの引数のみ(ほとんどの場合)。
この場合、パラメータタイプのdoStuff
がのターゲットタイプany()
になり、戻り値のタイプがany()
その引数タイプと一致するように選択されます。
このメカニズムは、主にラムダ式をコンパイルできるようにするためにJava 8で追加されましたが、一般的に型推論を改善します。
プリミティブタイプ
これはプリミティブ型では機能しません、残念ながら:
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
、例外がスローされます。
any
メソッドが機能するだけなので、Java 8以降、この質問はあまり注目されないだろうと推測していました。うまくいくものの答えを探すのではありません!