Bird
Raised Fist0
JUnittesting~5 mins

doReturn and doThrow in JUnit

Choose your learning style10 modes available
Introduction

We use doReturn and doThrow to control what a mocked method does during tests. This helps us check how our code behaves with different responses or errors.

When you want a mocked method to return a specific value without calling the real method.
When you want to simulate an exception being thrown by a mocked method.
When the method you mock is final or on a spy and cannot be stubbed with usual <code>when().thenReturn()</code> syntax.
When testing error handling by forcing exceptions from dependencies.
Syntax
JUnit
doReturn(value).when(mockObject).methodCall();
doThrow(exception).when(mockObject).methodCall();

doReturn sets a return value for a method call on a mock.

doThrow makes the method throw an exception when called.

Examples
This makes mockedList.get(0) return "Hello".
JUnit
doReturn("Hello").when(mockedList).get(0);
This makes mockedList.clear() throw a RuntimeException.
JUnit
doThrow(new RuntimeException()).when(mockedList).clear();
Sample Program

This test class shows two tests. The first uses doReturn to make get(0) return a fixed string. The second uses doThrow to make clear() throw an exception. Assertions check the expected results.

JUnit
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;

public class DoReturnDoThrowTest {

    @Test
    void testDoReturn() {
        List<String> mockedList = mock(List.class);
        doReturn("mocked value").when(mockedList).get(0);

        String result = mockedList.get(0);
        assertEquals("mocked value", result);
    }

    @Test
    void testDoThrow() {
        List<String> mockedList = mock(List.class);
        doThrow(new IllegalStateException("error")).when(mockedList).clear();

        Exception exception = assertThrows(IllegalStateException.class, () -> {
            mockedList.clear();
        });
        assertEquals("error", exception.getMessage());
    }
}
OutputSuccess
Important Notes

Use doReturn when the method is final or on a spy and cannot be stubbed with when().thenReturn().

doThrow is useful to test how your code handles exceptions from dependencies.

Always verify your mocks behave as expected with assertions.

Summary

doReturn sets a return value on a mock method call.

doThrow makes a mock method throw an exception.

Both help test different behaviors without calling real methods.

Practice

(1/5)
1. What is the main purpose of doReturn in JUnit mocking?
easy
A. To specify a value that a mocked method should return when called
B. To make a mocked method throw an exception
C. To verify how many times a method was called
D. To reset the state of a mock object

Solution

  1. Step 1: Understand doReturn usage

    doReturn is used to tell a mock what value to return when a specific method is called.
  2. Step 2: Differentiate from doThrow

    doThrow makes the method throw an exception, not return a value.
  3. Final Answer:

    To specify a value that a mocked method should return when called -> Option A
  4. Quick Check:

    doReturn sets return value [OK]
Hint: Remember: doReturn returns a value, doThrow throws exception [OK]
Common Mistakes:
  • Confusing doReturn with doThrow
  • Thinking doReturn verifies method calls
  • Assuming doReturn resets mocks
2. Which of the following is the correct syntax to make a mock method throw an exception using doThrow?
easy
A. doThrow().when(mockObject).methodName(new IOException());
B. doThrow(IOException).when(mockObject).methodName();
C. doThrow(new IOException()).when(mockObject).methodName();
D. doThrow(new IOException).methodName().when(mockObject);

Solution

  1. Step 1: Recall correct doThrow syntax

    The correct syntax is doThrow(new ExceptionType()).when(mock).method(); to specify the exception and method.
  2. Step 2: Check each option

    doThrow(new IOException()).when(mockObject).methodName(); matches the correct syntax exactly. Others have misplaced parentheses or wrong order.
  3. Final Answer:

    doThrow(new IOException()).when(mockObject).methodName(); -> Option C
  4. Quick Check:

    Correct doThrow syntax = doThrow(new IOException()).when(mockObject).methodName(); [OK]
Hint: Use new Exception() inside doThrow, then when(mock).method() [OK]
Common Mistakes:
  • Omitting 'new' before exception
  • Placing parentheses incorrectly
  • Calling method before when()
3. Given the following code snippet, what will be the output when mockService.getData() is called?
MyService mockService = mock(MyService.class);
doReturn("Hello").when(mockService).getData();
doThrow(new RuntimeException()).when(mockService).getData();
System.out.println(mockService.getData());
medium
A. Hello
B. RuntimeException is thrown
C. null
D. Compilation error

Solution

  1. Step 1: Analyze the order of stubbing

    First doReturn("Hello") is set, then doThrow(RuntimeException) overrides it for the same method.
  2. Step 2: Determine which stub applies on method call

    The last stub doThrow takes effect, so calling getData() throws RuntimeException.
  3. Final Answer:

    RuntimeException is thrown -> Option B
  4. Quick Check:

    Last stub wins, so exception thrown [OK]
Hint: Last doReturn or doThrow for method overrides previous [OK]
Common Mistakes:
  • Assuming first stub applies
  • Expecting returned string instead of exception
  • Thinking code won't compile
4. Identify the error in the following code snippet using doReturn and doThrow:
doReturn("Success").when(mockService).process();
doThrow(new IllegalArgumentException()).when(mockService).process();
doReturn("Done").when(mockService).process();
String result = mockService.process();
medium
A. The code will throw IllegalArgumentException at runtime
B. Cannot use doReturn and doThrow on the same method
C. doThrow must be called after doReturn to work
D. The last doReturn overrides previous stubs, so no error

Solution

  1. Step 1: Understand stub overriding order

    Stubs are applied in order; the last stub for a method is effective.
  2. Step 2: Check the last stub

    The last stub is doReturn("Done"), so calling process() returns "Done" without exception.
  3. Final Answer:

    The last doReturn overrides previous stubs, so no error -> Option D
  4. Quick Check:

    Last stub wins, no exception thrown [OK]
Hint: Last stub for method call is effective, no conflict error [OK]
Common Mistakes:
  • Thinking doThrow always throws exception regardless of order
  • Believing mixing doReturn and doThrow causes compile error
  • Expecting exception thrown despite last stub
5. You want to test a method that calls externalService.fetch(). You want to simulate two calls: the first returns "Data1", the second throws an IOException. Which is the correct way to stub fetch() using doReturn and doThrow?
hard
A. doReturn("Data1").doThrow(new IOException()).when(externalService).fetch();
B. doReturn("Data1").when(externalService).fetch(); doThrow(new IOException()).when(externalService).fetch();
C. doReturn("Data1").when(externalService).fetch(); doReturn("Data2").when(externalService).fetch();
D. doThrow(new IOException()).doReturn("Data1").when(externalService).fetch();

Solution

  1. Step 1: Understand chaining stubs for multiple calls

    Mockito allows chaining stubs with doReturn(...).doThrow(...).when(mock).method(); to simulate sequential calls.
  2. Step 2: Analyze options

    doReturn("Data1").doThrow(new IOException()).when(externalService).fetch(); correctly chains doReturn then doThrow for first return and second throw. Separate doReturn("Data1").when(externalService).fetch(); doThrow(new IOException()).when(externalService).fetch(); overrides stubs, causing all calls to throw the exception. The other options use repeated returns or incorrect order.
  3. Final Answer:

    doReturn("Data1").doThrow(new IOException()).when(externalService).fetch(); -> Option A
  4. Quick Check:

    Chain doReturn then doThrow for sequential calls [OK]
Hint: Chain doReturn().doThrow() for sequential call behaviors [OK]
Common Mistakes:
  • Overwriting stubs instead of chaining
  • Wrong order of doThrow and doReturn
  • Expecting multiple when() calls for sequence
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard