gpt4 book ai didi

java - Mockito isA(Class clazz) 如何解决类型安全问题?

转载 作者:IT老高 更新时间:2023-10-28 21:12:25 24 4
gpt4 key购买 nike

在我的测试中,我有以下行:

when(client.runTask(anyString(), anyString(), isA(Iterable.class)).thenReturn(...)

isA(Iterable.class)产生警告,它需要未经检查的转换才能符合 Iterable<Integer> .那是什么语法?

isA(Iterable<Integer>.class)
isA((Iterable<Integer>)Iterable.class

不工作。

有什么建议吗?

最佳答案

Mockito/Hamcrest 和泛型类

是的,这是 Mockito/Hamcrest 的普遍问题。通常将 isA() 与泛型类一起使用会产生警告。

对于最常见的泛型类有预定义的 Mockito 匹配器:anyList()anyMap()anySet()anyCollection()

建议:

Mockito 2.1.0 中的anyIterable()

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 限制为局部变量或辅助方法。

使用带有 TypeToken 的通用 isA() 匹配器

这可以很好地解决问题。但它有两个缺点:

  • 语法不太漂亮,可能会让一些人感到困惑。
  • 您对提供 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<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());
}
}

关于java - Mockito isA(Class<T> clazz) 如何解决类型安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12012249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com