Mockitoの一般的な「any()」メソッドを使用する


194

私は配列を期待するメソッドとのインターフェースを持っていますFoo

public interface IBar {
  void doStuff(Foo[] arr);
}

私はMockitoを使用してこのインターフェイスをモックしており、それdoStuff()が呼び出されたと主張したいのですが、渡された引数を検証したくありません-「気にしないでください」。

次のコードをany()、ジェネリックメソッドの代わりにを使用してどのように記述しますanyObject()か?

IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());

回答:


111

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以降、この質問はあまり注目されないだろうと推測していました。うまくいくものの答えを探すのではありません!
Lii

私のコードがなぜ機能しないのかわからなかったのでここに来ましたany()anyBoolean()、あなたの回答の最後の部分が美しく光っています
AdrienW

274

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

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

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

31
Scalaで誰かがそれを必要とする場合に備えて:verify(bar).DoStuff(any[Array[Foo]])
tolitius

6
インポートに問題があり、インポートでhamcrestのany()を使用していて、mockitoからのものと衝突しました。
Doppelganger

4
APIを確認してください。クラス引数はキャストにのみ使用され、メソッドはあらゆる種類のオブジェクトを受け入れます。site.mockito.org/mockito/docs/current/org/mockito/…。この場合はisA()を使用してください。site.mockito.org/mockito/docs/current/org/mockito/
thilko

1
このクラスは、Hamcrestとの名前の衝突を避けるために非推奨になりました。org.mockito.ArgumentMatchersを使用してください
leo9r

12

あなたはそれのために使うことができます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)


これが正解です。any(Clazz)の使用は完全に間違っています。
Surasin Tancharoen 2017

3
@SurasinTancharoen実際、any(Class)はisA(Class)の単なるエイリアスです(ドキュメントを参照)。だから、それはまったく間違っていません。
jmiserez 2017

8

私の最新のプロジェクトでこの機能を使用する必要があったため(ある時点で1.10.19から更新しました)、ユーザー(すでにmockito-coreバージョン2.1.0以降を使用している)を最新の状態に保つために、静的上記の回答のメソッドは、ArgumentMatchersクラスから取得する必要があります。

import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;

Mockitoアーティファクトをバージョン3以降で最新の状態に保つことを計画している場合は、このことに注意してください。このクラスはもう存在しない可能性があります。

2.1.0以降では、org.mockito.MatchersのJavadocは次のように述べています。

を使用しorg.mockito.ArgumentMatchersます。このクラスは、Hamcrest * org.hamcrest.Matchers クラスとの名前の衝突を避けるために非推奨になりました。このクラスはバージョン3.0で削除される可能性があります。

参考までに、mockitoのワイルドカードについて少し記事を書いています。


Scalaにorg.mockito.ArgumentMatcherをインポートするにはどうすればよいですか?org.mockito.ArgumentMatcher.anyをインポートしようとしました。エラー `value any is not a member of object org.mockito.ArgumentMatcher
Manu Chadha

バージョン3.0で同等の機能を教えてください。
Manu Chadha

それがリリースされたら、私たちは知っているでしょう;)
Maciej Kowalski
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.