Matchers.any()在Mockito中为null值

时间:2015-09-29 10:22:15

标签: 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);

但是它给出了一个错误:

  

无效使用参数匹配器获取空值。

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

4 个答案:

答案 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());