Bird
Raised Fist0
JUnittesting~10 mins

doReturn and doThrow in JUnit - Test Execution Trace

Choose your learning style10 modes available
Test Overview

This test demonstrates how to use doReturn to mock a method's return value and doThrow to simulate an exception in JUnit with Mockito. It verifies correct behavior when the mocked method returns a value and when it throws an exception.

Test Code - JUnit with Mockito
JUnit
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

class Service {
    String fetchData() {
        return "real data";
    }
}

public class DoReturnDoThrowTest {

    @Test
    void testDoReturnAndDoThrow() {
        Service mockService = Mockito.mock(Service.class);

        // Use doReturn to mock fetchData to return "mocked data"
        doReturn("mocked data").when(mockService).fetchData();
        String result = mockService.fetchData();
        assertEquals("mocked data", result);

        // Use doThrow to mock fetchData to throw RuntimeException
        doThrow(new RuntimeException("Error occurred")).when(mockService).fetchData();
        RuntimeException thrown = assertThrows(RuntimeException.class, () -> {
            mockService.fetchData();
        });
        assertEquals("Error occurred", thrown.getMessage());
    }
}
Execution Trace - 7 Steps
StepActionSystem StateAssertionResult
1Test startsJUnit test runner initialized—PASS
2Mockito creates mock object of Service classmockService is a mock instance of Service—PASS
3doReturn("mocked data") set up for mockService.fetchData()fetchData() will return "mocked data" when called—PASS
4Call mockService.fetchData()fetchData() returns "mocked data"assertEquals("mocked data", result)PASS
5doThrow(RuntimeException) set up for mockService.fetchData()fetchData() will throw RuntimeException when called—PASS
6Call mockService.fetchData() expecting exceptionfetchData() throws RuntimeException with message "Error occurred"assertThrows(RuntimeException.class, ...), assertEquals("Error occurred", thrown.getMessage())PASS
7Test endsAll assertions passed—PASS
Failure Scenario
Failing Condition: If doReturn or doThrow is not set up correctly, fetchData() returns null or does not throw exception
Execution Trace Quiz - 3 Questions
Test your understanding
What does doReturn("mocked data").when(mockService).fetchData() do?
AIt makes fetchData() return "mocked data" when called
BIt throws an exception when fetchData() is called
CIt calls the real fetchData() method
DIt disables fetchData() method
Key Result
Use doReturn() to safely mock methods especially on spy objects to avoid calling real methods, and use doThrow() to simulate exceptions for robust negative testing.

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