是否可以用泛型传递接口的类型?
接口:
public interface AsyncCallback<T>
在我的测试方法中:
Mockito.any(AsyncCallback.class)
将<ResponseX>
放在后面或用于.class
不起作用。
有一种类型安全的方法:使用ArgumentMatchers.any()
并用类型限定它
ArgumentMatchers.<AsyncCallback<ResponseX>>any()
使用Java 8,由于增强了类型推断,您可以简单地使用any()
(假设静态导入(,而不需要参数或类型参数。编译器现在从目标类型(方法参数的类型(中知道,您实际上指的是Matchers.<AsyncCallback<ResponseX>>any()
,这是Java 8之前的解决方案。
我不得不采用以下机制来允许泛型:
import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);
希望这能帮助到别人。
发布pierrefevrier注释作为答案,如果它出现在答案而不是注释中,则可能会很有用。
使用Mockito的新版本:(Matchers.<AsyncCallback<ResponseX>>any()
根据thSoft的回答,在方法中对any((进行限定调用意味着我可以删除限定,因为返回类型允许推断:
private HashMap<String, String> anyStringStringHashMap() {
return Matchers.any();
}
我在使用Spring Example
:时遇到了类似的问题
Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
.thenReturn(Lists.emptyList());
在这里,您必须使用限定,b/c findAll方法可以采用多种类型,如Sort
和Iterable
。当然,您也可以将Mockito.any(Example.class)
与类型安全警告一起使用。
使用不带参数的限定泛型类型any()
方法有效(即ArgumentMatchers.<AsyncCallback<ResponseX>>any()
(,但对于较长的泛型表达式可能会变得难以处理。另一种选择是在自己的泛型方法中放入无参数any()
调用,使用特定的泛型类型作为返回类型:
private static <T> AsyncCallback<T> anyAsyncCallback() {
return ArgumentMatchers.any()
}
用法
Mockito.verify(mockObject).performCallback(any(), anyAsyncCallback())
您可以直接投射它,如果您喜欢,可以添加抑制警告:
@SuppressWarnings("unchecked")
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)
如果Java允许"泛型"泛型,他们可以有这样的方法,这就是你想要的
private static <T, E> T<E> mock(Class<T<E>> clazz)