Mockito is a popular mocking framework used for unit testing Java applications. It allows developers to mock objects and simulate their behavior in order to isolate and test specific parts of the code. Along with mocking object interactions, Mockito also provides capabilities to handle method invocations, return values, and exceptions. In this article, we will explore these features and see how they can be effectively used in unit tests.
When writing unit tests, we often want to verify that certain methods are called on our mocked objects. Mockito provides various methods to verify method invocations. One such method is verify()
.
For example, let's assume we have a class called Calculator
that performs mathematical operations. We want to verify if the add()
method is called on our mocked Calculator
object. We can achieve this using the following code:
Calculator calculator = Mockito.mock(Calculator.class);
calculator.add(2, 3);
verify(calculator).add(2, 3);
In the above code, we first create a mock object of the Calculator
class using Mockito.mock()
. Then, we invoke the add()
method on the mock object. Finally, we verify if the add()
method is called with the specified arguments using verify()
.
Sometimes, we may want to define the return value of a mocked method. Mockito allows us to do this using the when().thenReturn()
syntax.
Continuing with our Calculator
example, suppose we want to mock the multiply()
method and specify a return value. We can achieve this using the following code:
Calculator calculator = Mockito.mock(Calculator.class);
when(calculator.multiply(2, 3)).thenReturn(6);
int result = calculator.multiply(2, 3);
assertEquals(6, result);
In the above code, we first create a mock object of the Calculator
class. Then, we use when().thenReturn()
to specify the return value of the multiply()
method when called with arguments 2
and 3
. Finally, we invoke the multiply()
method with the same arguments and assert that the returned value is 6
.
Mockito also allows us to mock methods that throw exceptions. We can define the exception to be thrown using the when().thenThrow()
syntax.
Let's consider a scenario where we have a FileReader
class that reads a file and throws an IOException
if the file is not found. We can mock this behavior using the following code:
FileReader fileReader = Mockito.mock(FileReader.class);
when(fileReader.read()).thenThrow(new IOException());
assertThrows(IOException.class, fileReader::read);
In the above code, we create a mock object of the FileReader
class. Then, we use when().thenThrow()
to specify that the read()
method should throw an IOException
when called. Finally, we assert that invoking the read()
method on the mock object throws an IOException
.
Mockito provides powerful capabilities to handle method invocations, return values, and exceptions in unit tests. By leveraging these capabilities, developers can effectively mock object behavior, define return values, and simulate exceptional scenarios. This helps in writing robust and reliable unit tests, ultimately leading to higher quality software development.
Note: It is important to remember that Mockito should be used responsibly and judiciously. Overusing mocking can lead to brittle tests and defeat the purpose of unit testing.
noob to master © copyleft