java - Matchers.any()在Mockito中为空值

标签 java mockito

假设我有这个对象objectDemo,它使用2个参数String和null调用方法objectDemoMethod。现在,我想验证此方法是否已通过Mockito调用:

objectDemo.objectDemoMethod("SAMPLE_STRING", null);


我写了这个:

Mockito.verify(objectDemo, Mockito.times(1)).objectDemoMethod(Matchers.any(String.class), null);


但它给出了一个错误:


无效使用参数匹配器作为空值。


还有其他方法可以传递空值吗?

最佳答案

由于您仅对一个参数使用参数匹配器,而对另一个参数不使用参数,因此会出现错误消息。从Matchers Javadoc:


如果使用参数匹配器,则所有参数都必须由匹配器提供。


因此,解决方法是对方法的第二个参数也使用匹配器。在这种情况下,它将是匹配null的匹配器。根据Mockito和Java的版本,您可以:


从Mockito 2开始,您可以使用ArgumentMatchers.isNull()。这适用于Java 8及更高版本:

verify(objectDemo, times(1)).objectDemoMethod(any(String.class), isNull());


请注意,如果您使用的是Java 7或更早版本,则需要进行显式转换才能完成此工作,因为这些Java版本中的类型推断未考虑称为的方法的类型:

verify(objectDemo, times(1)).objectDemoMethod(any(String.class), (String) isNull());

如果使用的是Mockito 1,则可以使用Matchers.isNull(clazz)代替:

verify(objectDemo, times(1)).objectDemoMethod(any(String.class), isNull(String.class));



对于Java≤7或Mockito 1的情况,本示例使用第二个参数的类型为String的情况:需要将其替换为方法参数的实际类型。

关于java - Matchers.any()在Mockito中为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60120154/

相关文章:

java - Arrays.sort( myarray) 物理上改变了数组?

java - 如何验证父类的 super.method() 的调用?

java - 在 Java/Mockito 中验证对未模拟对象的调用

spring-mvc - Mockito 验证 post 对象具有相同的值而不是相同的对象引用

spring-boot - 如何在Service层模拟一个方法

java - 无法通过appium在android模拟器中启动计算器

java - 这个基本的通用示例真的无法实现吗?

java - 静态方法调用另一个静态方法,对象引用作为参数 :Is It Thread Safe?

java - 仅在单击鼠标 Swing 时打开 popupMenu

mocking - 自定义匹配器的 Mockito 错误