Java Mockito.any()使用泛型传递接口

Java Mockito.any()使用泛型传递接口,java,generics,mockito,Java,Generics,Mockito,可以用泛型传递接口类型吗 界面: public interface AsyncCallback<T> 将放在后面或为放置。class不起作用。您可以将其强制转换,如果愿意,可以添加抑制警告: @SuppressWarnings("unchecked") AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class) @SuppressWarnings(“未选中”) AsyncCallba

可以用泛型传递接口类型吗

界面:

public interface AsyncCallback<T>

放在
后面或为
放置。class
不起作用。

您可以将其强制转换,如果愿意,可以添加抑制警告:

@SuppressWarnings("unchecked")    
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)
@SuppressWarnings(“未选中”)
AsyncCallback=Mockito.any(AsyncCallback.class)
如果Java允许“泛型”泛型,那么它们可以有这样一个方法,这正是您需要的

private static <T, E> T<E> mock(Class<T<E>> clazz)
private static T mock(类clazz)

您可以将其强制转换,如果愿意,可以添加抑制警告:

@SuppressWarnings("unchecked")    
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)
@SuppressWarnings(“未选中”)
AsyncCallback=Mockito.any(AsyncCallback.class)
如果Java允许“泛型”泛型,那么它们可以有这样一个方法,这正是您需要的

private static <T, E> T<E> mock(Class<T<E>> clazz)
private static T mock(类clazz)

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

ArgumentMatchers.<AsyncCallback<ResponseX>>any()
ArgumentMatchers.any()

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

ArgumentMatchers.<AsyncCallback<ResponseX>>any()
ArgumentMatchers.any()

我必须采用以下机制来允许泛型:

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

希望这对某人有所帮助。

我不得不采用以下机制来允许泛型:

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

希望这对其他人有所帮助。

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

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

继thSoft的回答之后,在方法中对any()进行限定调用意味着我可以删除限定,因为返回类型允许推断:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}
private HashMap anystringhashmap(){
返回Matchers.any();
}

在thSoft的回答之后,将限定调用放在方法中的any()意味着我可以删除限定,因为返回类型允许推断:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}
private HashMap anystringhashmap(){
返回Matchers.any();
}

将Pierrefervrier评论发布为答案,如果答案中出现的是Pierrefervrier评论,而不是评论,则可能会很有用


对于Mockito的新版本:
(Matchers.any()

将Pierrefervrier注释作为答案发布,如果它出现在答案中而不是注释中,可能会很有用


对于Mockito的新版本:
(Matchers.any()
我在使用Spring
示例时遇到了类似的问题:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());
Mockito.when(repo.findAll(Mockito.any()))
.thenReturn(Lists.emptyList());

在这里,您必须使用限定,b/c findAll方法可以采用多种类型,如
Sort
Iterable
。您也可以使用
Mockito.any(Example.class)
当然还有类型安全警告。

我在使用Spring时遇到了类似的问题
Example

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());
Mockito.when(repo.findAll(Mockito.any()))
.thenReturn(Lists.emptyList());

在这里,您必须使用限定,b/c findAll方法可以采用多种类型,如
Sort
Iterable
。您还可以使用
Mockito.any(Example.class)
当然还有类型安全警告。

使用限定的泛型类型,而不带参数
any()
方法可以工作(即
ArgumentMatchers.any()
),但对于较长的泛型表达式,可能会变得笨拙。另一种方法是将无参数
any()
调用放在其自己的泛型方法中,使用特定的泛型类型作为返回类型:

private static AsyncCallback anyAsyncCallback(){
返回ArgumentMatchers.any()
}
用法
Mockito.verify(mockObject.performCallback(any(),anyAsyncCallback())

使用带有无参数
any()
方法的限定泛型类型是可行的(即
ArgumentMatchers.any()
),但对于较长的泛型表达式可能会变得笨拙。另一种方法是将无参数
any()
调用放在其自己的泛型方法中,使用特定泛型类型作为返回类型:

private static AsyncCallback anyAsyncCallback(){
返回ArgumentMatchers.any()
}
用法
Mockito.verify(mockObject.performCallback(any(),anyAsyncCallback())

当我尝试此操作时,我在测试中收到一个错误:
您不能在验证或存根之外使用参数匹配器。
使用
@SuppressWarnings
不是一个好主意:在java 8之前,如果要将其分配给单独的变量,您可以使用
any()
如Intoy的答案所示。现在使用Java8,
any()
可以内联使用,无需单独赋值。@kevinarpe如果您有多个参数匹配器,则必须按照Java语言指定的顺序调用它们。当我尝试此操作时,我在测试中收到一个错误:
您不能在验证或存根之外使用参数匹配器。
使用
@Suppre不是一个好主意ssWarnings
:在java 8之前,如果要将其分配给一个单独的变量,您可以使用
any()
,就像他们的回答一样。现在在java 8中,
any()
可以内联使用,而无需单独分配。@kevinarpe如果您有多个参数匹配器,则必须按java语言的顺序调用它们