是否可以用泛型传递接口的类型?

的接口:

public interface AsyncCallback<T>

在我的测试方法中:

Mockito.any(AsyncCallback.class)

把<ResponseX>放在后面或为.class没有工作。


当前回答

使用无参数any()方法的限定泛型类型可以工作(例如ArgumentMatchers.<AsyncCallback<ResponseX>>any()),但对于较长的泛型表达式可能会变得笨拙。另一种方法是在它自己的泛型方法中放置一个无参数any()调用,使用特定的泛型类型作为返回类型:

private static <T> AsyncCallback<T> anyAsyncCallback() {
  return ArgumentMatchers.any()
}

使用

Mockito.verify(mockObject).performCallback(any(), anyAsyncCallback())

其他回答

我在使用Spring示例时遇到了类似的问题:

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

有一种类型安全的方法:使用ArgumentMatchers.any()并使用类型限定它:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

使用Java 8,您可以简单地使用任何()(假设静态导入)而不带参数或类型参数,因为增强了类型推断。编译器现在从目标类型(方法参数的类型)知道你实际上指的是Matchers.<AsyncCallback<ResponseX>>any(),这是java 8之前的解决方案。

我不得不采用以下机制来考虑泛型:

import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

希望这能帮助到一些人。