Bird
Raised Fist0
JUnittesting~3 mins

Why doReturn and doThrow in JUnit? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

What if you could make your tests instantly return any result or error without waiting or failing unpredictably?

The Scenario

Imagine you are testing a method that calls another method which might return a value or throw an error. You try to test this by running the real code every time.

But what if the called method depends on a database or external service? You have to wait, and sometimes it fails unpredictably.

The Problem

Manually running the real method slows down tests a lot. It also makes tests unreliable because external factors can cause failures.

It is hard to test error cases because you cannot easily force the method to throw an exception.

The Solution

Using doReturn and doThrow lets you control what the called method does during tests.

You can make it return a specific value or throw an exception instantly, without running the real code.

This makes tests fast, reliable, and easy to write for both success and error cases.

Before vs After
✗ Before
when(mock.method()).thenCallRealMethod(); // runs real code, slow and unpredictable
✓ After
doReturn(value).when(mock).method(); // returns value instantly
 doThrow(new Exception()).when(mock).method(); // throws exception instantly
What It Enables

You can quickly and reliably test how your code handles both normal results and errors without depending on real external calls.

Real Life Example

Testing a payment service method that calls a bank API: use doReturn to simulate a successful payment response, and doThrow to simulate a network failure, all without calling the real bank API.

Key Takeaways

doReturn lets you fake a method's return value easily.

doThrow lets you simulate exceptions to test error handling.

Both make tests faster, more reliable, and simpler to write.

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