Mockito/Hamcrestおよびジェネリッククラス
はい、これはMockito/Hamcrestの一般的な問題です。通常isA()
、ジェネリッククラスで使用すると、警告が発生します。
最も一般的な汎用クラスには、事前に定義されたMockitoマッチャーがあります:anyList()、、、および。anyMap()
anySet()
anyCollection()
提案:
Mockito 2.1.0のanyIterable()
Mockito 2.1.0は、Iterablesを照合するための新しいanyIterable()メソッドを追加しました。
when(client.runTask(anyString(), anyString(), anyIterable()).thenReturn(...)
Eclipseでは無視する
Eclipseで警告を取り除きたいだけの場合。Eclipse Indigo以降にオプションが存在します:
ウィンドウ>設定>Java>コンパイラ>エラー/警告>ジェネリック型>避けられないジェネリック型の問題を無視する
@SuppressWarningsによるクイックフィックス
問題が1回だけ発生する場合は、これを行うことをお勧めします。私は個人的にこれまでにが必要だったことを覚えていませんisA(Iterable.class)
。
Daniel Prydenが言うように、を@SuppressWarnings
ローカル変数またはヘルパーメソッドに制限することができます。
TypeTokenで汎用isA()マッチャーを使用する
これは問題を永久に解決します。ただし、2つの欠点があります。
- 構文はあまりきれいではなく、一部の人を混乱させる可能性があります。
TypeToken
クラスを提供するライブラリへの追加の依存関係があります。ここでは、GuavaのTypeTokenクラスを使用しました。TypeToken
GsonとGenericType
JAX-RSにもクラスがあります。
汎用マッチャーの使用:
import static com.arendvr.matchers.InstanceOfGeneric.isA;
import static org.mockito.ArgumentMatchers.argThat;
// ...
when(client.runTask(anyString(), anyString(), argThat(isA(new TypeToken<Iterable<Integer>>() {}))))
.thenReturn(...);
ジェネリックマッチャークラス:
package com.arendvr.matchers;
import com.google.common.reflect.TypeToken;
import org.mockito.ArgumentMatcher;
public class InstanceOfGeneric<T> implements ArgumentMatcher<T> {
private final TypeToken<T> typeToken;
private InstanceOfGeneric(TypeToken<T> typeToken) {
this.typeToken = typeToken;
}
public static <T> InstanceOfGeneric<T> isA(TypeToken<T> typeToken) {
return new InstanceOfGeneric<>(typeToken);
}
@Override
public boolean matches(Object item) {
return item != null && typeToken.getRawType().isAssignableFrom(item.getClass());
}
}