假设我有这个对象objectDemo,它使用2个参数String和null调用方法objectDemoMethod。现在我想验证这个方法是用Mockito调用的:
objectDemo.objectDemoMethod("SAMPLE_STRING", null);
我写了这个:
Mockito.verify(objectDemo, Mockito.times(1)).objectDemoMethod(Matchers.any(String.class), null);
但是它给出了一个错误:
无效使用参数匹配器获取空值。
有没有其他方法可以传递空值?
答案 0 :(得分:48)
由于您只使用参数匹配器而不是另一个参数,因此预期会出现错误消息。来自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
的情况:它需要替换为方法参数的实际类型。
答案 1 :(得分:1)
isNull
似乎已弃用
对于Java 8,此方法将在Mockito 3.0中删除。此方法仅用于通用友好性以避免转换,Java 8中不再需要此方法。
我认为您可以使用nullable
:
public static <T> T nullable(Class<T> clazz)
您可以使用类似的内容:
verify(objectDemo, times(1)).objectDemoMethod(any(String.class), isNull(String.class));
答案 2 :(得分:0)
只需使用:
Mockito.verify(objectDemo, Mockito.times(1)).objectDemoMethod(Matchers.any(String.class), (ClassName) isNull());
以上在Java 8版本中帮助我。希望对您有帮助。
答案 3 :(得分:0)
您可以使用Mockito的ArgumentMatchers类,如下所示:
Mockito.verify(objectDemo).objectDemoMethod(ArgumentMatchers.any(String.class), ArgumentMatchers.isNull());