Mockito.any()通过泛型接口


170

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

界面:

public interface AsyncCallback<T>

在我的测试方法中:

Mockito.any(AsyncCallback.class)

<ResponseX>后面或.class没有工作。

Answers:


306

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

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

4
我确认此答案有效,并正确消除了警告。
kevinarpe

1
这并不是真正安全,因为实际方法只能使用正确键入的参数来调用。只需要满足缺少这种类型推断的java8之前的编译器。
herman 2014年

我使用类似这样的东西ResponseEntity <List <Map <String,Object >>> responseEntity = Matchers。并且总是返回null
Arun

6
使用新版本的Mockito:(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier

15
Matchers实际上已被弃用,但ArgumentMatchers确实可行。
guijob

67

使用Java 8,any()由于增强了类型推断功能,因此您可以简单地使用(假定静态导入)不带参数或类型参数。现在,编译器从目标类型(方法参数的类型)知道您的实际意思Matchers.<AsyncCallback<ResponseX>>any(),这是Java 8之前的解决方案。


也不会any()匹配AsyncCallback<AnyOtherType>吗?
马修(Matthew)

AsyncCallback<AnyOtherType>如果参数类型为“ AsyncCallback <ResponseX>”,则@MatthewRead Using 甚至不应编译。
赫尔曼

1
我想知道参数类型也是通用的情况,但是您只想模拟一个具体类型(或者以不同方式模拟多个类型)。鉴于when(x.y(any())).thenAnswer(...)例如,当ypublic <T> T y(AsyncCallback<T> arg)。如果需要的话,也许最好检查一下答案的类型?
马修(Matthew)

2
@MatthewRead由于擦除,Mockito无法在运行时检查实际类型。因此,您甚至无法使用isA()。如果该对象包含Class与该类型相对应的对象,并且接口公开了该对象,那么我想您可以在自定义匹配器中对其进行检查。或者例如,在a的情况下,Collection您可以检查元素的类型。
herman

1
MatchersArgumentMatchers在Mockito v2中被替换-bheussler
6

15

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

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

希望这对某人有帮助。


3
见我的回答:这是没有必要使用Java 8
赫尔曼

5

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

使用新版本的Mockito: (Matchers.<AsyncCallback<ResponseX>>any()


1
我将他的评论添加到了原始答案
Joergi '17

2

除了thSoft的答案之外,将有条件的调用放入方法中的any()意味着我可以删除条件,因为返回类型允许推断:

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

0

您可以进行强制转换,并在需要时添加抑制警告:

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

如果Java允许使用“泛型”泛型,那么他们可以使用类似您所寻找的方法

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

当我尝试此操作时,我在测试中收到一个错误:You cannot use argument matchers outside of verification or stubbing.
kevinarpe 2014年

不好用@SuppressWarnings:java 8之前的版本,如果要将其分配给一个单独的变量,则可以使用any()intoy的答案中的as。现在使用Java 8,any()可以内联使用,而无需单独分配。
herman 2014年

@kevinarpe如果您有多个参数匹配器,则必须按Java语言指定的顺序调用它们。
TWiStErRob '16

0

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

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

在这里,您必须使用限定,b / c findAll方法可以采用多种类型,例如SortIterableMockito.any(Example.class)当然,您也可以将其与类型安全警告一起使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.