【发布时间】:2011-09-04 18:25:48
【问题描述】:
使用 Mockito,我可以做到以下几点:
verify(someService).process(any(Person.class));
但是如果process 取而代之的是Collection<Person>,我该怎么写呢?无法弄清楚如何正确编写它。只是遇到语法错误...
【问题讨论】:
标签: java generics parameters verification mockito
使用 Mockito,我可以做到以下几点:
verify(someService).process(any(Person.class));
但是如果process 取而代之的是Collection<Person>,我该怎么写呢?无法弄清楚如何正确编写它。只是遇到语法错误...
【问题讨论】:
标签: java generics parameters verification mockito
试试:
verify(someService).process(Matchers.<Collection<Person>>any());
实际上,当我输入 any() 时,IntelliJ 自动建议了此修复程序...不幸的是,在这种情况下您不能使用静态导入。
【讨论】:
Matchers 已弃用,现在应使用 ArgumentMatchers。
试试:
verify(someService).process(anyCollectionOf(Person.class));
自从版本1.8Mockito引入
public static <T> Collection<T> anyCollectionOf(Class<T> clazz);
【讨论】:
如果你使用自己的方法,你甚至可以使用静态导入:
private Collection<Person> anyPersonCollection() {
return any();
}
然后就可以使用了
verify(someService).process(anyPersonCollection());
【讨论】:
作为已接受答案的替代方案,您可以尝试:
verify(someService).process(Mockito.<SomeGenericClass<Person>>any());
我使用org.mockito.Mockito 而不是Matchers。
【讨论】:
由于类型擦除,您无法表达这一点。即使你可以用代码表达它,Mockito 也没有机会在运行时检查它。您可以创建一个类似
的界面interface PersonCollection extends Collection<Person> { /* nothing */ }
而是在整个代码中使用它。
编辑:我错了,Mockito 有 anyCollectionOf(..) 这是你想要的。
【讨论】:
any(new TypeLiteral<Collection<Person>>() {})。当然不漂亮,但它确实有效,因为所有类型信息都在运行时可用(通过反射或字节码库)。