ジェネリックスを使用したMockito.any()のインターフェースを渡す

ジェネリックスでインターフェイスのタイプを渡すことは可能ですか?

インタフェース:

public interface AsyncCallback

私のテスト方法では:

Mockito.any(AsyncCallback.class)

Putting behind or for .class didnt work.

106

6 答え

タイプセーフな方法があります: ArgumentMatchers.any()を使用し、タイプを修飾します:

ArgumentMatchers.>any()

コメントに記載されているpierrefevrierとして、それは新しいバージョンのMockitoで

Matchers.>any()
205
追加された
これは本当に安全な方法ではありません。なぜなら実際のメソッドは正しい型指定の引数でしか呼び出せないからです。この種の型推論が欠けていたpre-java8コンパイラを満たすことが必要でした。
追加された 著者 herman,
私はこのようなものを使用しました。ResponseEntity >> responseEntity = Matchers >>> any();そして、それは常にnullを返します
追加された 著者 Arun,
この回答が機能し、警告が正しく表示されることを確認します。
追加された 著者 kevinarpe,
Matchers は廃止されましたが、 ArgumentMatchers は機能しました。
追加された 著者 guijob,
ArgumentMatchersを使用した最初のものは私のために働きました。そしてMatchersを使用する2番目のものは非難されました。私はResponseXとは何か混乱しました。私の場合、私は次のように書いています:ArgumentMatchers。> any()
追加された 著者 Barani r,
Mockitoの新しいバージョン:(Matcher。 any()
追加された 著者 pierrefevrier,

Using Java 8, you can simply use any() (assuming static import) without argument or type parameter because of enhanced type inference. The compiler now knows from the target type (the type of the method argument) that you actually mean Matchers.>any(), which is the pre-Java 8 solution.

47
追加された
@MatthewRead引数タイプが 'AsyncCallback 'の場合、 AsyncCallback を使用してコンパイルするべきではありません。
追加された 著者 herman,
@MatthewRead消去のため、実行時にMockitoによって実際のタイプをチェックすることはできません。したがって、 isA()を使用することさえできません。オブジェクトがその型に対応する Class オブジェクトを保持していて、インタフェースがこれを公開している場合は、カスタムマッチャーでチェックすることができます。例えば、 Collection の場合、要素のタイプをチェックすることができます。
追加された 著者 herman,
Mockito v2の MatchersArgumentMatchers に置き換えられました
追加された 著者 bheussler,
AsyncCallbackany()と一致しませんか?
追加された 著者 Matthew Read,
私は、引数の型も一般的な状況について疑問を抱いていますが、あなたはそれをある具体的な型のために擬似したい(あるいは別の方法で複数の型を擬似的に擬似したい)だけです。 ypublic T y(AsyncCallback when(xy(any)))、thenAnswer(...) > arg)をクリックします。それが必要な場合は、答えの型をチェックする方がよいでしょうか?
追加された 著者 Matthew Read,
ああ、あなたは完全に正しい。私は実際にタイプの消去についてもっと読んでいましたが、何らかの理由でこれに接続しませんでした。説明をありがとう!
追加された 著者 Matthew Read,

私はジェネリック医薬品を可能にするために次のメカミズムを採用しなければなりませんでした。

import static org.mockito.Matchers.any;
List list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

これが誰かを助けることを望みます。

11
追加された
私の答えを見てください:これはもはやJava 8では必要ありません。
追加された 著者 herman,

コメントの代わりに答えに存在する場合に役立つかもしれない答えとしてpierrefevrierのコメントを投稿する。

With new versions of Mockito: (Matchers.>any()

3
追加された
私は元の答えに彼のコメントを追加した
追加された 著者 Joerg,

それをキャストするだけで、必要に応じて警告を表示することができます:

@SuppressWarnings("unchecked")    
AsyncCallback callback = Mockito.any(AsyncCallback.class)

Javaが「ジェネリック」ジェネリックを許可した場合、あなたが探しているものであるこのようなメソッドを持つことができます

private static  T mock(Class> clazz)
1
追加された
@SuppressWarnings を使うのは良い考えではありません:pre-java 8、別の変数に代入する場合は、イントイのように any()回答。 Java 8では、 any()を個別の割り当てを必要とせずにインラインで使用できます。
追加された 著者 herman,
これを試してみると、テストでエラーが発生しました。検証やスタブ以外の引数マッチャーは使用できません。
追加された 著者 kevinarpe,
@kevinarpe複数の引数マッチャーを持っている場合は、Java言語が指定する順序で呼び出さなければなりません。
追加された 著者 TWiStErRob,

さらにthSoftの答えでは、メソッドのany()への修飾された呼び出しは、戻り型の推論が許可されているため、資格を削除できることを意味しました。

private HashMap anyStringStringHashMap() {
    return Matchers.any();
}
0
追加された