Unit testing void methods with Mockito and JUnit

Reading Time: 3 minutes
Junit tests using Mockito & PowerMockito - Bhasaka

Writing functionality is the main focus whenever we are writing a software program, but it is equally important that we make sure our code works the way we intended it to. And how do we do that? By writing unit test cases. They are used to test the smallest functionality of code. Unit test cases are an essential part of software development. In this blog, we are going to cover one of the testing scenarios in which we will be writing Unit test cases for void functions with Mockito.

How to Test void methods

As we already know that our aim is to test void methods in a class but it is also really important to understand why do we test void methods. 

Whenever we write unit test cases for any method we expect a return value from the method and generally use assert for checking if the functions return the value that we expect it to return, but in the case of void methods, they do not return any value. So how do we check if our method is functioning properly? Let’s see using an example.

In this example, we are creating Two classes Information and Publishing.

The Information class looks like this:

public class Information {

   private final Publishing publishing;

   public Information(Publishing publishing) {
       this.publishing = publishing;
   }

   public void sendInfoForPublishing(Person person) {
       publishing.publishInformation(person);
   }
}

As we can see the method sendInformationForPublishing() is a void method. The logic for the method is simple. It takes a Person object as a parameter and passes the object to the method of Publishing class.

The method publishInformation() is also a void method.

public class Publishing {

   public void publishInformation(Person person) {
       System.out.println(person);
   }
}

Let us now see how we can write unit test cases for this simple implementation.

Using the verify() method

Whenever we mock a void method we do not expect a return value that is why we can only verify whether that method is being called or not. 

Features of verify():

  • Mockito provides us with a verify() method which lets us verify whether the mock void method is being called or not. 
  • It lets us check the number of methods invocations. So if the method invocation returns to be zero we would know that our mock method is not being called.
verify(publishing,times(1)).publishInformation(person);

The verify method takes two arguments. The mock method object and the number of invocations you want to verify. The expected number of invocations is passed in the times() method. Let’s see how the test case will look like.

public class InformationTest {

   Publishing publishing = mock(Publishing.class);

   @Autowired
   private Information information;

   @Test
   void whenSendInformationForPublishingIsSuccessful() {
       information = new Information(publishing);
       Person person = ObjectCreator.getPerson();
       doNothing().when(publishing).publishInformation(person);
       information.sendInfoForPublishing(person);
       verify(publishing,times(1)).publishInformation(person);
   }
}

As our function will call the publishInformation() only once so we have passed the value 1 in the times() function. We know that when our test case will call the mocked publishInformation() method, it will not do anything. We need to let Mockito know of this behavior. For this, we use the doNothing() method. Which will in simple terms let Mockito know that it needs to do nothing when the given method is called.

If we change the number of invocations to any other value the test case should fail.

Here I changed the number of invocations to 2.

That’s it! It’s that simple. This is how we can unit test the void methods. 

The GitHub link for this implementation is provided here. Simply clone it have fun!

Checkout more fun blogs on Java and JUnit on Knoldus Blogs.

This image has an empty alt attribute; its file name is footer-2.jpg

Leave a Reply