Mockito / Hamcrest和泛型类
是的,这是一个普遍的问题与Mockito / Hamcrest。通常使用isA()与泛型类会产生警告。
有最常见的泛型类的预测的Mockito匹配器:anyList(),anyMap(),anySet()和anyCollection()。
建议:
anyIterable()在Mockito 2.1.0
Mockito 2.1.0添加了一个新的anyIterable()匹配Iterables的方法:
when(client.runTask(anyString(), anyString(), anyIterable()).thenReturn(...)
在Eclipse中忽略
如果你只是想摆脱在Eclipse中的警告。选项自Eclipse Indigo起存在:
Window > Preferences > Java > Compiler > Errors/Warnings > Generic
types > Ignore unavoidable generic type problems
使用@SuppressWarnings快速修复
我建议你这样做,如果你有这个问题只有一次。我个人不记得曾经需要一个isA(Iterable.class)。
正如Daniel Pryden所说,你可以将@SuppressWarnings限制为局部变量或帮助方法。
使用泛型isA()匹配器与TypeToken
这解决了问题的好。但它有缺点:
>语法不太漂亮,可能会混淆一些人。
>您对提供TypeToken类的库有附加的依赖关系。这里我使用的是TypeToken class from Guava.Gson中还有一个TypeToken类和一个JAX-RS中的GenericType。
使用通用匹配器:
import static com.arendvr.matchers.InstanceOfGeneric.isA;
import static org.mockito.ArgumentMatchers.argThat;
// ...
when(client.runTask(anyString(), anyString(), argThat(isA(new TypeToken>() {}))))
.thenReturn(...);
通用匹配器类:
package com.arendvr.matchers;
import com.google.common.reflect.TypeToken;
import org.mockito.ArgumentMatcher;
public class InstanceOfGeneric implements ArgumentMatcher {
private final TypeToken typeToken;
private InstanceOfGeneric(TypeToken typeToken) {
this.typeToken = typeToken;
}
public static InstanceOfGeneric isA(TypeToken typeToken) {
return new InstanceOfGeneric<>(typeToken);
}
@Override
public boolean matches(Object item) {
return item != null && typeToken.getRawType().isAssignableFrom(item.getClass());
}
}