Home >Java >javaTutorial >Mockito: `doReturn()` vs. `when()`: When Should I Use Which?
Mockito: Understanding the Difference between doReturn() and when()
It's understandable to encounter confusion between Mockito's doReturn()...when() and when()...thenReturn() methods, as they may appear to be doing the same thing. While both can mock method calls and return predefined values, there is a subtle distinction that becomes relevant when using spied objects (annotated with @Spy) instead of mocks (annotated with @Mock).
The Key Difference: Method Invocation Behavior
The crucial difference lies in how these methods behave when interacting with spied objects:
Example to Illustrate the Difference:
Consider the following code:
public class MyClass { public String methodToBeTested() { return anotherMethodInClass(); } public String anotherMethodInClass() { throw new NullPointerException(); } }
Test using spied object:
@Spy private MyClass myClass; // ... // This approach will work without throwing an exception doReturn("test").when(myClass).anotherMethodInClass(); // This approach will throw a NullPointerException when(myClass.anotherMethodInClass()).thenReturn("test");
With a spied object, when()...thenReturn() attempts to call anotherMethodInClass() which will throw a NullPointerException. In contrast, doReturn()...when() avoids calling the method and returns "test" directly, suppressing the exception.
Conclusion
The difference between these two methods becomes apparent when using spied objects. For spied objects, doReturn()...when() offers greater control by bypassing actual method calls and returning predefined values directly. In contrast, when()...thenReturn() invokes the real methods, which can lead to exceptions or other unintended behavior. Thus, choosing the appropriate method depends on the desired behavior and whether you're using a mock or a spied object.
The above is the detailed content of Mockito: `doReturn()` vs. `when()`: When Should I Use Which?. For more information, please follow other related articles on the PHP Chinese website!