Map 的 Mockito 参数匹配器可以为 null

Dav*_*arr 7 mockito

我正在将一些测试从 Mockito 1.x 转换为 2.15.0。

对于字符串参数来说,处理“null”值的新方法相对简单。对于 Map 参数来说,这似乎有点困难,但我认为使用类型参数的任何类型都会遇到同样的问题。

我尝试过以下替代方案:

  1. anyMap()
  2. isNull()
  3. nullable(Map.class)
  4. (Map<KeyType,ValueType>) nullable(Map.class)

第一个是 2.x 转换之前的原始版本。如果值为空则不匹配。如果值始终为空,则第二个有效,但我不喜欢它,因为它会在测试中删除类型信息。第三个似乎是正确的,但它无法编译,因为形式参数类型使用泛型。第四部作品很成功,但我不喜欢那里的演员阵容。

有没有更清洁的解决方案?

Jef*_*ica 5

用于any()此。any(Class<T> clazz)与or不同anyMap(),Mockito 允许作为值any进行匹配。null

对于历史好奇的人:布莱斯在这里解释了词源any(T.class)看起来像“any T”,对于它来说null意义不大,并且any(T.class)采用与 相同instanceof的语义isA(T.class)any()仍然正确地代表“任何值”,包括null.

还有其他解决方案,例如or(isNull(), anyMap()),但它们是多余的:Java 将确保唯一可传递的值是null正确通用的 Map,并且在 Java 8 及更高版本中,推理已改进到 Java 将正确推断您的 Map 的程度,包括仿制药。

另请参阅:Mockito 匹配器 isA、any、eq 和 Same 之间有什么区别?