Bird
Raised Fist0
JUnittesting~3 mins

Why when().thenReturn() stubbing in JUnit? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

What if you could make your tests run instantly and never fail because of outside services?

The Scenario

Imagine you have a calculator app that depends on a complex math service. To test the calculator, you try calling the real math service every time manually.

You have to wait for the real service to respond, and sometimes it gives different answers or takes too long.

The Problem

Manually calling the real service is slow and unreliable.

You might get wrong results if the service changes or is down.

This makes your tests flaky and frustrating to run again and again.

The Solution

Using when().thenReturn() lets you fake the service response easily.

You tell the test exactly what to return when a method is called, so tests run fast and always get the expected answer.

Before vs After
✗ Before
MathService math = new RealMathService();
int result = math.add(2, 3);
assertEquals(5, result);
✓ After
MathService math = mock(MathService.class);
when(math.add(2, 3)).thenReturn(5);
assertEquals(5, math.add(2, 3));
What It Enables

This lets you test your code in isolation, making tests fast, reliable, and easy to write.

Real Life Example

When testing a shopping cart, you can stub the payment service to always approve payments without calling the real bank every time.

Key Takeaways

Manual calls to real services slow down and break tests.

when().thenReturn() stubbing fakes method calls with fixed results.

This makes tests fast, stable, and focused on your code.

Practice

(1/5)
1. What is the main purpose of when().thenReturn() in JUnit testing?
easy
A. To specify a fake return value for a mocked method call
B. To execute the real method instead of a mock
C. To verify that a method was called
D. To create a new instance of the class under test

Solution

  1. Step 1: Understand mocking in tests

    Mocking replaces real objects with fake ones to control behavior during tests.
  2. Step 2: Role of when().thenReturn()

    This syntax sets a fake return value for a method call on a mock object.
  3. Final Answer:

    To specify a fake return value for a mocked method call -> Option A
  4. Quick Check:

    when().thenReturn() = fake return value [OK]
Hint: Remember: when().thenReturn() fakes method results [OK]
Common Mistakes:
  • Thinking it calls the real method
  • Using it on real objects instead of mocks
  • Confusing it with verification methods
2. Which of the following is the correct syntax to stub a method getName() of a mock object userMock to return "Alice"?
easy
A. thenReturn("Alice").when(userMock.getName());
B. when(userMock.getName()).thenReturn("Alice");
C. userMock.when(getName()).thenReturn("Alice");
D. when(userMock.getName() == "Alice");

Solution

  1. Step 1: Recall correct when().thenReturn() syntax

    The correct order is when(methodCall).thenReturn(value);
  2. Step 2: Check each option

    when(userMock.getName()).thenReturn("Alice"); matches the correct syntax exactly; others are invalid or reversed.
  3. Final Answer:

    when(userMock.getName()).thenReturn("Alice"); -> Option B
  4. Quick Check:

    Correct syntax = when().thenReturn() [OK]
Hint: Syntax is when(methodCall).thenReturn(value) [OK]
Common Mistakes:
  • Reversing when() and thenReturn() order
  • Calling when() on the mock object instead of method
  • Using equality inside when()
3. Given the code below, what will result print?
List<String> mockList = mock(List.class);
when(mockList.size()).thenReturn(5);
int result = mockList.size();
System.out.println(result);
medium
A. 0
B. null
C. 5
D. Throws NullPointerException

Solution

  1. Step 1: Understand stubbing of mockList.size()

    The size() method is stubbed to return 5 whenever called on mockList.
  2. Step 2: Check the printed result

    Calling mockList.size() returns 5 as stubbed, so result is 5 and prints 5.
  3. Final Answer:

    5 -> Option C
  4. Quick Check:

    Stubbed method returns set value [OK]
Hint: Stubbed methods return thenReturn() value, not default [OK]
Common Mistakes:
  • Assuming default mock return 0 instead of stubbed 5
  • Expecting real method execution
  • Confusing null with int return
4. Identify the error in the following stubbing code:
MyService service = new MyService();
when(service.getData()).thenReturn("Mocked Data");
medium
A. Cannot stub a method on a real object, must mock it first
B. Missing semicolon after thenReturn()
C. Incorrect method name getData()
D. thenReturn() cannot return a String

Solution

  1. Step 1: Check object type used in when()

    The object service is a real instance, not a mock, so stubbing is invalid.
  2. Step 2: Understand mocking requirement

    Stubbing works only on mock objects created by mock() or similar methods.
  3. Final Answer:

    Cannot stub a method on a real object, must mock it first -> Option A
  4. Quick Check:

    Stub only mocks, not real objects [OK]
Hint: Stub only mock objects, not real instances [OK]
Common Mistakes:
  • Trying to stub real objects
  • Ignoring need to mock before stubbing
  • Assuming thenReturn() syntax error
5. You want to stub a method calculate(int x) of a mock calculatorMock to return x * 2 for any integer input. Which is the correct way to do this using when().thenReturn()?
hard
A. when(calculatorMock.calculate(2)).thenReturn(4);
B. when(calculatorMock.calculate(anyInt())).thenReturn(x * 2);
C. when(calculatorMock.calculate(anyInt())).thenReturn(2);
D. when(calculatorMock.calculate(anyInt())).thenAnswer(invocation -> (int) invocation.getArgument(0) * 2);

Solution

  1. Step 1: Understand when().thenReturn() limitation

    thenReturn() returns a fixed value, cannot compute based on input parameter.
  2. Step 2: Use thenAnswer() for dynamic return

    thenAnswer() allows lambda to compute return based on method arguments.
  3. Final Answer:

    when(calculatorMock.calculate(anyInt())).thenAnswer(invocation -> (int) invocation.getArgument(0) * 2); -> Option D
  4. Quick Check:

    Dynamic return needs thenAnswer(), not thenReturn() [OK]
Hint: Use thenAnswer() for dynamic returns, not thenReturn() [OK]
Common Mistakes:
  • Trying to compute dynamic values with thenReturn()
  • Using undefined variable x in thenReturn()
  • Stubbing only one input value instead of anyInt()
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