Mockito anyMapOf 嵌套泛型

2022-09-04 07:48:05

我正在尝试验证是否调用了具有以下签名的方法:

public void process(Map<String, Set<String>> data) {
  ...
}

嵌套的参数化集给我带来了麻烦。我可以让它与any()匹配器正确验证,如下所示:

verify(dataProcessor).process(Matchers.<Map<String, Set<String>>> any());

Mockito 中所述:使用通用参数进行验证,尽管很烦人,但如果我对 Matchers.any 进行直接静态导入并将其称为:“仅”,则无法正常工作:

verify(dataProcessor).process(<Map<String, Set<String>>> any())

但是在这种情况下,anyMapOf(clazz,clazz)似乎是更合适的匹配器。由于你不能做Set.class我不确定你会怎么做。由于缺乏通用,以下方法不起作用:

verify(dataProcessor).process(anyMapOf(String.class, Set.class));

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


答案 1

没有办法用它来做到这一点。它旨在帮助解决在Java 7中将简单类映射到简单类的简单情况,而您的情况比这更复杂。anyMapOf

改进了 Java 8 参数推理,因此在 Java 8 中,您可以只使用 .any()

verify(dataProcessor).process(Matchers.any());

除此之外,使这种外观的最佳方法是像您上面写的那样:

verify(dataProcessor).process(Matchers.<Map<String, Set<String>>>any());

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

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

private static Map<String, Set<String>> anyStringSetMap() {
  return any();
}

(注意:请注意,的返回值是;这是调用您要查找的任何内容的副作用。提取的方法只是为了通知Java编译器预期的返回类型;要小心,做任何更花哨的事情可能会以非常有趣的方式打破。anyStringSetMap()null


答案 2

推荐