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


170

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

インターフェース:

public interface AsyncCallback<T>

私のテスト方法では:

Mockito.any(AsyncCallback.class)

パッティング<ResponseX>の後ろまたはのため.classのdidnt仕事。

回答:


306

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

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

4
私はこの答えが機能し、警告を正しく抑制していることを確認します。
kevinarpe 2014年

1
実際のメソッドは、とにかく正しく型付けされた引数でしか呼び出せないので、これは本当に安全ではありません。この種の型推論に欠けていたjava8以前のコンパイラを満足させるだけで十分でした。
ヘルマン2014

私は次のようなものを使用しましたResponseEntity <List <Map <String、Object >>> responseEntity = Matchers。<ResponseEntity <List <Map <String、Object >>>> any(); そして常にnullを返します
Arun

6
Mockitoの新しいバージョン:(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier

15
Matchers実際には非推奨ですが、ArgumentMatchers機能しました。
guijob

67

Java 8を使用すると、any()型推論が強化されているため、引数や型パラメーターなしで(静的インポートを想定して)単純に使用できます。コンパイラーは、ターゲット・タイプ(メソッド引数のタイプ)から、実際に意味することを認識しますMatchers.<AsyncCallback<ResponseX>>any()。これは、Java 8より前のソリューションです。


同様にany()一致AsyncCallback<AnyOtherType>しませんか?
Matthewが

@MatthewReadを使用しAsyncCallback<AnyOtherType>ても、引数の型が 'AsyncCallback <ResponseX>'の場合はコンパイルできません。
ハーマン、

1
引数の型もジェネリックであるが、1つの具象型に対してのみモックしたい(または、さまざまな方法で複数の型に対してモックしたい)状況について考えている。与えられたwhen(x.y(any())).thenAnswer(...)例えば、どこyですpublic <T> T y(AsyncCallback<T> arg)。おそらくそれが必要な場合は、答えのタイプをチェックする方が良いでしょう?
マシューが読む

2
@MatthewRead消去のため、実際の型は実行時にMockitoでチェックできません。したがって、使用することもできませんisA()。オブジェクトがClassタイプに対応するオブジェクトを保持していて、インターフェースがこれを公開している場合、カスタムマッチャーで確認できます。または、たとえば、aのCollection場合、要素のタイプを確認できます。
ハーマン、2016年

1
MatchersArgumentMatchersMockito v2で置き換えられました
bheussler 2017年

15

ジェネリック医薬品を可能にするために、次のメカニズムを採用する必要がありました。

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

これが誰かを助けることを願っています。


3
私の答えを参照:これは、Java 8でもはや必要では
ハーマン

5

pierrefevrierコメントを回答として投稿します。コメントの代わりに回答に含まれている場合に役立ちます。

Mockitoの新しいバージョン: (Matchers.<AsyncCallback<ResponseX>>any()


1
元の回答に彼のコメントを追加しました
Joergi

2

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

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}

0

キャストするだけで、必要に応じて抑制警告を追加できます。

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

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

private static <T, E> T<E> mock(Class<T<E>> clazz)

私はこれを試したとき、私は私のテストでエラーを受信しました:You cannot use argument matchers outside of verification or stubbing.
kevinarpe

使用するのは良い考えではありません。Java8以前@SuppressWarningsでは、別の変数に割り当てる場合any()は、Intoyの答えのように使用できます。Java 8ではany()、個別の割り当てを必要とせずにインラインで使用できます。
ヘルマン2014

@kevinarpe(複数の引数マッチャーがある場合は、Java言語で指定されている順番で呼び出す必要があります)。
TWiStErRob 2016年

0

Springを使用して同様の問題がありましたExample

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

ここでは、資格を使用する必要があり、B / CのfindAllメソッドは、複数のタイプを取るようにすることができますSortIterableMockito.any(Example.class)もちろん型式安全警告と併用することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.