The Mockito framework is one of the most popular testing tools in Java, especially useful for creating unit tests. One of the most important tasks in testing is simulating the behavior of objects to check how the code under test reacts to them. Mockito allows you to do this by stubbing methods using thenReturn
and thenAnswer
. While these methods may look similar at first glance, each serves a slightly different purpose.
thenReturn
– Simple Value Returning
The thenReturn
method is used to return a static, predefined value every time a mocked method is called. It is simpler and most useful when you want to depend on a fixed value in your tests.
Example of using thenReturn
:
// Creating a mocked object
List<String> mockList = Mockito.mock(List.class);
// Setting the return value
Mockito.when(mockList.get(0)).thenReturn("Hello, Mockito!");
// Test: every call to `get(0)` will return the same value
assertEquals("Hello, Mockito!", mockList.get(0));
assertEquals("Hello, Mockito!", mockList.get(0));
In the example above, the get(0)
method of the mocked list always returns "Hello, Mockito!"
. thenReturn
is ideal when you want to ensure that a method always returns the same constant value.
thenAnswer
– Dynamic Value Returning
The thenAnswer
method is more flexible, as it allows returning dynamically generated values based on the method invocation. This enables you to tailor the return value to the context of the call, making it a great fit for more complex scenarios.
Example of using thenAnswer
:
List<String> mockList = Mockito.mock(List.class);
// Setting a dynamically returned value
Mockito.when(mockList.get(Mockito.anyInt())).thenAnswer(invocation -> {
Integer index = invocation.getArgument(0); // Retrieve argument from invocation
return "Dynamic value for index: " + index;
});
// Test: different values returned based on the method argument
assertEquals("Dynamic value for index: 0", mockList.get(0));
assertEquals("Dynamic value for index: 1", mockList.get(1));
Here, thenAnswer
allows generating return values depending on the method’s argument. Within thenAnswer
, you get access to the InvocationOnMock
object, which contains details about the method call, enabling more sophisticated logic.
When to Use thenReturn
vs thenAnswer
?
The choice between thenReturn
and thenAnswer
depends on the needs of your test:
- When the return value is constant –
thenReturn
is perfect when you always expect the same response, regardless of the method parameters. - When the return value depends on arguments or context –
thenAnswer
is the better choice if you need to customize the response based on dynamic parameters or simulate more complex behavior.
Summary
thenReturn
is a simpler method used to return a specific, constant value.thenAnswer
enables more complex, dynamic behavior that responds to method call arguments.
Both methods are essential in the unit testing process, and using them appropriately can significantly enhance the clarity and flexibility of your tests. Choosing the right approach mainly depends on your specific test scenario.