1. ホーム

[解決済み】Mockitoの汎用 "any() "メソッドを使用する。

2022-04-09 22:15:51

質問

の配列を必要とするメソッドを持つインターフェイスがあります。 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 メソッドを実行すると、コンパイラによって型の引数が推論されます。

verify(bar).doStuff(any());


説明

Java8で新しくなったのは ターゲットタイプ は、そのサブ式の型パラメータを推論するために使用されます。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 という例外がスローされます。