当前位置: 首页 > 知识库问答 >
问题:

Mockito anyMapOf嵌套泛型

陈朗
2023-03-14

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

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

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

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

如Mockito:使用泛型参数进行验证中所述,尽管令人恼火的是,如果我直接静态导入Matchers,它不起作用。任意,并将其称为:

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

但是在这种情况下,anyMapOf(clazz,clazz)似乎是更合适的匹配器。既然你不会做Set.class,我不知道你会怎么做。由于缺乏类属,以下内容不起作用:

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

是否可以使用 anyMapOf 验证这种情况,或者我应该坚持使用匹配器。

共有1个答案

龙俊德
2023-03-14

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

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

(注意:注意anyStringSetMap()返回值为null;这是调用您正在寻找的任何的副作用。提取的方法只是为了通知Java编译器理论收益类型;小心,做任何更花哨的事情可能会以非常有趣的方式中断。)

 类似资料:
  • 和这个问题相关的课程: 现在,这似乎已被编译器接受。不幸的是,我不知道/理解如何创建的新实例,。 当然,这确实不起作用:

  • 问题内容: 为什么这样做: 虽然这会产生类型不匹配错误: 为什么是这样?是否有办法解决此问题,而不使用原始类型? 问题答案: 尝试 注意:请注意,当您使用类似List的集合时,您只能在“只读”模式下使用它(添加空值除外)。

  • 问题内容: 这样编译(1.6) 但这不是 的错误 有人可以解释为什么吗?谢谢 编辑:编辑为结果 问题答案: 因为这会破坏类型安全性:

  • 给定这样一个类 如何实现可以处理嵌套泛型类型的自定义Kafka反序列化器? 附注:我正在使用jackson进行序列化/反序列化。

  • 我已经试过各种方法来解决这个问题了。但没有成功。 我有几节这样的课 在这种情况下,T可以是任何对象,并且应该可以在运行时解析。 Jackson真的无法将json反序列化为泛型类型吗?

  • 我有以下对象初始化。它是RestfulService类的一部分。 它在类中使用了几次,但有不同的参数。例如。 更新... 我的尝试是这样的。这种工作。然而,它现在只映射到一个通用的LinkedList。忽略对象类型。