Java 嵌套泛型的Mockito anyMap
我正在尝试验证是否调用了具有以下签名的方法:Java 嵌套泛型的Mockito anyMap,java,generics,mocking,mockito,Java,Generics,Mocking,Mockito,我正在尝试验证是否调用了具有以下签名的方法: public void process(Map<String, Set<String>> data) { ... } 是否可以使用anyMapOf验证这种情况,还是应该使用Matchers.any()?无法使用anyMapOf来验证这种情况。它的目的是帮助在Java7中将简单类映射到简单类的简单案例,而您的案例要复杂得多 Java8参数推断得到了改进,因此在Java8中,您只需使用any() 除此之外,最好的方法是让它看
public void process(Map<String, Set<String>> data) {
...
}
是否可以使用anyMapOf验证这种情况,还是应该使用Matchers.any()?无法使用
anyMapOf
来验证这种情况。它的目的是帮助在Java7中将简单类映射到简单类的简单案例,而您的案例要复杂得多
Java8参数推断得到了改进,因此在Java8中,您只需使用any()
除此之外,最好的方法是让它看起来像你上面写的:
verify(dataProcessor).process(Matchers.<Map<String, Set<String>>>any());
verify(数据处理器).process(Matchers.any());
或者通过将匹配器提取到一个静态函数,该函数为Java提供了足够的信息,以便它自己推断类型:
@Test public void yourTest() {
// ...
verify(dataProcessor).process(anyStringSetMap());
}
private static Map<String, Set<String>> anyStringSetMap() {
return any();
}
@Test public void yourTest(){
// ...
验证(dataProcessor).process(anyStringSetMap());
}
私有静态映射anyStringSetMap(){
返回任何();
}
(注意:
anyStringMap
的返回值为空;它是唯一的。提取的方法只是通知Java编译器预期的返回类型;注意,做任何喜欢的事情都可能会以非常有趣的方式中断。)您的方法签名已经限制了该方法使用的参数类型,为什么不直接使用any()
?不使用Map
调用方法的代码甚至不会编译…@fge Java type inference在调用any
时不会根据process
中可用的参数类型推断类型变量,因为process
可能有自己的重载和/或类型参数。它在返回值和字段中执行此操作,因为该类型已显式定义为返回值类型或字段类型。一切就绪。谢谢杰夫,很高兴得到确认。如果它在这个项目中变得足够普遍,那么也许我会选择新的静态匹配器。
verify(dataProcessor).process(anyMapOf(String.class, Set.class));
verify(dataProcessor).process(Matchers.any());
verify(dataProcessor).process(Matchers.<Map<String, Set<String>>>any());
@Test public void yourTest() {
// ...
verify(dataProcessor).process(anyStringSetMap());
}
private static Map<String, Set<String>> anyStringSetMap() {
return any();
}