Mockito:使用通用参数进行验证

67

使用Mockito,我可以做到以下:

verify(someService).process(any(Person.class));

但是如果process接受一个Collection<Person>,我该怎么写呢?无法找出正确的写法,一直得到语法错误...

5个回答

110

尝试:

verify(someService).process(ArgumentMatchers.<Collection<Person>>any());

事实上,当我键入any()时,IntelliJ自动建议了这个修复方法...不幸的是,你不能在这种情况下使用静态导入。


4
谢谢,它起作用了...但天哪,它看起来太糟糕了,一定有更好的方法来写这个... - Cristiano Fontes
1
点赞唯一解决方案,它回答了所述问题,而不是针对匹配容器的特殊情况。 - Adam Parkin
1
这个答案现在不正确了。下面的答案提供了更好的解决方案。 - scubbo
1
我可能错了,但我认为这不是正确的答案。虽然它消除了警告,但验证从“any(Collection.class)”转换为any(),它不会验证任何东西。至少以前有一个类检查。不是吗? - Gabriel Falcone
你是如何让IntelliJ自动为你提供建议的? - Daniel Kaplan
3
Matchers 已经被弃用,现在应该使用 ArgumentMatchers - Ray

27

试一试:

verify(someService).process(anyCollectionOf(Person.class));

自版本1.8起,Mockito引入了

public static <T> Collection<T> anyCollectionOf(Class<T> clazz);

对于其他需要的人,除了anyCollectionOf()之外,还有一个anyListOf(),请参见:https://dev59.com/kWkv5IYBdhLWcg3wjxhl#10512526 - Elijah Lofgren
1
anyCollectionOf(Class<T> clazz) 方法将在 Mockito 3.0 和 Java8 中被移除。新的方法是:anyOptional(Class<T> class),请参见:https://github.com/mockito/mockito/issues/308 - Naxos84

1
如果您使用自己的方法,甚至可以使用静态导入:
private Collection<Person> anyPersonCollection() {
    return any();
}

然后您可以使用。
verify(someService).process(anyPersonCollection());

0

作为接受答案的替代方案,您可以尝试:

verify(someService).process(Mockito.<SomeGenericClass<Person>>any());

我在使用org.mockito.Mockito而不是Matchers


-1
由于类型擦除,您无法表达这个。即使您可以在代码中表达它,Mockito 在运行时也无法检查它。您可以创建一个类似的接口。
interface PersonCollection extends Collection<Person> { /* nothing */ }

请使用这种方式替代,并在您的代码中始终如一地使用它。

编辑:我错了,Mockito有anyCollectionOf(..),这就是您想要的。


1
实际上,如果API接受它,它可以用“类型文字”对象来表示:any(new TypeLiteral<Collection<Person>>() {})。当然不太美观,但它确实可以工作,因为所有类型信息都可以在运行时(通过反射或字节码库)获得。 - Rogério
@Rogerio:你说得对,而且现在Mockito似乎确实支持这个功能。我已经有一段时间没有使用它了... - Waldheinz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接