java clazz_java – Mockito isA(Class clazz)如何解决类型安全?

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());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值