web-dev-qa-db-ja.com

Mockitoの一般的な "any()"メソッドを使う

私は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());
173
ripper234

Java 8以降、引数なしのanyメソッドを使用でき、type引数はコンパイラによって推論されます。

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

説明

Java 8の新機能は、式の ターゲット型 が、そのサブルーチンの型パラメータを推測するために使用されることです。式Java 8より前のバージョンでは、型パラメーターの推論に使用されるメソッドへの引数のみ(ほとんどの場合)。

この場合、パラメータ型doStuffany()のターゲット型になり、戻り値の型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

問題は、コンパイラがIntegerany()の戻り値として推論することです。 Mockitoはこれを認識せず(型が消去されるため)、参照型のデフォルト値(null)を返します。ランタイムは、戻り値をintValueに渡す前にdoStuffメソッドを呼び出すことによって、戻り値のボックス化を解除しようとしますが、例外がスローされます。

87
Lii

これはうまくいくはずです

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));
262
jitter

そのために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)

10
thilko

私は最新のプロジェクトにこの機能を使う必要があったので(ある時点で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で削除される予定です。

4
Maciej Kowalski