Matchers.any() for null value in Mockito

JavaMockito

Java Problem Overview


Suppose I am having this object objectDemo which calls to the method objectDemoMethod with 2 parameters String and null. Now I want to verify with Mockito that this method was called:

objectDemo.objectDemoMethod("SAMPLE_STRING", null);

I have written this:

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

but it's giving an error:

> Invalid use of argument matchers for null value.

Is there any another way to pass null value?

Java Solutions


Solution 1 - Java

The error message you are getting is expected since you are using argument matcher for only one argument and not the other. From Matchers Javadoc: > If you are using argument matchers, all arguments have to be provided by matchers.

Therefore, the fix is to use a matcher for the second parameter of the method as well. In this case, it would be a matcher matching null. Depending on the version of Mockito and Java, you can have:

  • Starting with Mockito 2, you can use ArgumentMatchers.isNull(). This works with Java 8 and above:

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

Note that if you're running with Java 7 or older, you'll need an explicit cast to make this work, because the type inference in those versions of Java does not take into account the types of the method called:

    verify(objectDemo, times(1)).objectDemoMethod(any(String.class), (String) isNull());
  • If you're using Mockito 1, you can use the Matchers.isNull(clazz) instead:

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

For the Java ≤ 7 or Mockito 1 cases, the examples uses a case where the second parameter was of type String: it would need to be replaced with the actual type of the method parameter.

Solution 2 - Java

isNull seems to be deprecated

> With Java 8 this method will be removed in Mockito 3.0. This method is only used for generic friendliness to avoid casting, this is not anymore needed in Java 8.

I think you could use nullable:

  • public static <T> T nullable(Class<T> clazz)

You could use something like:

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




 

Solution 3 - Java

Just use:

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

Above help me in java 8 version. Hope this will help you.

Solution 4 - Java

You can make use of Mockito's ArgumentMatchers class, like so:

Mockito.verify(objectDemo).objectDemoMethod(ArgumentMatchers.any(String.class), ArgumentMatchers.isNull());

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAvinash JadhavView Question on Stackoverflow
Solution 1 - JavaTunakiView Answer on Stackoverflow
Solution 2 - JavaAmadeu Cavalcante FilhoView Answer on Stackoverflow
Solution 3 - JavaankitView Answer on Stackoverflow
Solution 4 - JavaKwabena BerkoView Answer on Stackoverflow