Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 嵌套泛型的Mockito anyMap_Java_Generics_Mocking_Mockito - Fatal编程技术网

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();
}