Mockito anyMapOf嵌套泛型

Ben*_*Ben 12 java generics mocking mockito

我试图验证具有以下签名的方法被调用:

public void process(Map<String, Set<String>> data) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

嵌套的参数化Set给我带来了困难.我可以使用any()匹配器来正确验证它,如下所示:

verify(dataProcessor).process(Matchers.<Map<String, Set<String>>> any());
Run Code Online (Sandbox Code Playgroud)

Mockito中所述:使用泛型参数进行验证虽然令人讨厌,但如果我直接静态导入Matchers.any并将其称为以下内容则无效:

verify(dataProcessor).process(<Map<String, Set<String>>> any())
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,anyMapOf(clazz,clazz)似乎更合适.既然你不能做Set.class我不知道你会怎么做.以下不起作用,因为缺乏通用:

verify(dataProcessor).process(anyMapOf(String.class, Set.class));
Run Code Online (Sandbox Code Playgroud)

是否可以使用anyMapOf验证这种情况,还是应该坚持使用Matchers.<> any()?

Jef*_*ica 21

没有办法anyMapOf用来做这件事.它旨在帮助简单地将简单类映射到Java 7中的简单类,而您的复杂程度要高得多.

Java 8参数推断得到改进,因此在Java 8中,您可以使用any().

verify(dataProcessor).process(Matchers.any());
Run Code Online (Sandbox Code Playgroud)

除此之外,制作这种外观的最佳方式就像你上面写的那样:

verify(dataProcessor).process(Matchers.<Map<String, Set<String>>>any());
Run Code Online (Sandbox Code Playgroud)

或者通过将匹配器提取到静态函数,这为Java提供了足够的信息,它需要自己推断类型:

@Test public void yourTest() {
  // ...
  verify(dataProcessor).process(anyStringSetMap());
}

private static Map<String, Set<String>> anyStringSetMap() {
  return any();
}
Run Code Online (Sandbox Code Playgroud)

(警告:请注意,返回值为anyStringMapnull;这是您正在寻找的调用的副作用any.提取的方法只是告知Java编译器预期的返回类型;请注意,做任何更好的事情都可能会破坏以非常有趣的方式.)