2011-05-30 108 views
59

随着我的Mockito验证可以做到以下几点:的Mockito:与泛型参数

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

但我怎么写这个,如果process需要Collection<Person>呢?无法弄清楚如何正确编写它。只是得到语法错误...

回答

102

尝试:

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

事实上,自动的IntelliJ当我输入any() ...可惜你不能在这种情况下使用静态导入建议此修复程序。

+0

这似乎工作! – Svish 2011-05-30 11:55:31

+4

感谢它的工作......但上帝看起来很可怕,必须有一个更好的方式来对... – 2013-01-10 19:01:25

+1

竖起大拇指上唯一的解决方案,回答问题的陈述,而不是针对匹配容器的特殊情况。 – 2013-11-15 04:07:01

-1

由于类型擦除你不能表达。即使你可以用代码表达它,Mockito也没有机会在运行时检查它。你可以创建一个接口,如

interface PersonCollection extends Collection<Person> { /* nothing */ } 

改为在整个代码中使用它。

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

+1

实际上,如果API接受它,它*可以用“类型文字”对象表示:'any(new TypeLiteral >(){})''。当然不是很漂亮,但它确实有效,因为所有的类型信息在运行时都可用(通过反射或字节码库)。 – 2011-05-30 11:49:54

+0

@Rogerio:你说的对,现在看来Mockito的确支持这一点。有一段时间没有使用它... – Waldheinz 2011-05-30 11:56:15

21

尝试:

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

由于版本1.8的Mockito介绍

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

对于其他需要它的人来说,除了anyCollectionOf(),还有一个anyListOf(),请参阅:http://stackoverflow.com/a/10512526/908677 – 2016-08-16 18:47:34

+0

anyCollectionOf(类 clazz)将被删除Mockito 3.0和java8。将会有一个新的方法:anyOptional(类类)请参阅:https://github.com/mockito/mockito/issues/308 – Naxos84 2018-01-09 11:15:15

1

,如果您使用的是自己的方法,你甚至可以使用静态导入:

private Collection<Person> anyPersonCollection() { 
    return any(); 
} 

然后你可以使用

verify(someService).process(anyPersonCollection());