Home >Java >javaTutorial >Mockito: `doReturn()` vs. `when()`: When Should I Use Which?

Mockito: `doReturn()` vs. `when()`: When Should I Use Which?

Barbara Streisand
Barbara StreisandOriginal
2024-11-28 03:44:10925browse

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:

  • when()...thenReturn() makes a real method call before returning the specified value. This means any exceptions thrown by the real method will still need to be handled.
  • doReturn()...when() does not call the method at all. Instead, it directly returns the predefined value. This bypasses any actual method invocation.

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn