Mockito.any() 通过泛型接口

问题描述 投票:0回答:8

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

界面:

public interface AsyncCallback<T>

在我的测试方法中:

Mockito.any(AsyncCallback.class)

<ResponseX>
放在后面或用于
.class
不起作用。

java generics mockito
8个回答
464
投票

有一种类型安全的方法:使用

ArgumentMatchers.any()
并用类型限定它:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

82
投票

使用 Java 8,由于增强的类型推断,您可以简单地使用

any()
(假设静态导入)而无需参数或类型参数。编译器现在从目标类型(方法参数的类型)知道您实际上的意思是
Matchers.<AsyncCallback<ResponseX>>any()
,这是 Java 8 之前的解决方案。


23
投票

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

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

希望这对某人有帮助。


6
投票

将 pierrefevrier 评论发布为答案,如果它出现在答案而不是评论中,这可能会很有用。

使用新版本的 Mockito:

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


5
投票

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

Example
:

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

这里,你必须使用限定条件,b/c findAll 方法可以采用多种类型,例如

Sort
Iterable
。当然,您也可以将
Mockito.any(Example.class)
与类型安全警告一起使用。


4
投票

进一步 thSoft 的回答将合格的调用放在方法中的 any() 意味着我可以删除资格,因为返回类型允许推断:

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

1
投票

将合格的泛型类型与无参数

any()
方法一起使用是可行的(即
ArgumentMatchers.<AsyncCallback<ResponseX>>any()
),但对于较长的泛型表达式可能会变得难以处理。另一种方法是将无参数
any()
调用放入其自己的泛型方法中,使用特定的泛型类型作为返回类型:

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

使用方法

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

0
投票

您可以直接投射它,如果您愿意,可以添加抑制警告:

@SuppressWarnings("unchecked")    
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)

如果 Java 允许“通用”泛型,他们可能会有这样的方法,这就是您正在寻找的

private static <T, E> T<E> mock(Class<T<E>> clazz)
© www.soinside.com 2019 - 2024. All rights reserved.