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

时间:2018-10-25 17:37:02

标签: mockito

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

使用新的“空”值处理对于String参数而言相对简单。使用Map参数似乎要困难一些,但我认为使用类型参数的任何类型都会遇到相同的问题。

我尝试了以下替代方法:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

出于对历史的好奇:Brice explains the etymology hereany(T.class)看起来像“任何T”,null的意义较小,而any(T.class)则采用与instanceof相同的类似isA(T.class)的语义。 any()仍正确代表“任何值”,包括null

还有其他解决方案,例如or(isNull(), anyMap()),但它们是多余的:Java将确保唯一可传递的值是null或适当通用的Map,并且在Java 8和更高版本中均是如此。已经改进到Java可以正确推断出包含泛型的Map的程度。

另请参阅:What's the difference between Mockito Matchers isA, any, eq, and same?