Bird
Raised Fist0
JUnittesting~8 mins

when().thenReturn() stubbing in JUnit - Framework Patterns

Choose your learning style10 modes available
Framework Mode - when().thenReturn() stubbing
Folder Structure
src/
└── test/
    └── java/
        └── com/
            └── example/
                ├── pages/
                │   └── LoginPage.java
                ├── tests/
                │   └── LoginServiceTest.java
                ├── utils/
                │   └── TestUtils.java
                └── mocks/
                    └── UserRepositoryMock.java
    

This structure separates page objects, tests, utilities, and mocks for clear organization.

Test Framework Layers
  • Mocks Layer: Contains mock objects created with Mockito to simulate dependencies.
  • Page Objects Layer: Represents UI pages or service classes under test.
  • Test Layer: Contains JUnit test classes that use mocks and verify behavior.
  • Utilities Layer: Helper methods for common test tasks.
  • Configuration Layer: Manages test settings like environment variables and test data.
Configuration Patterns

Use @BeforeEach in JUnit to initialize mocks and set up stubbing with when().thenReturn().

Manage environment-specific data using src/test/resources properties files loaded in tests.

Example snippet for stubbing a method:

import static org.mockito.Mockito.*;

@BeforeEach
void setup() {
    userRepository = mock(UserRepository.class);
    when(userRepository.findUserById(1)).thenReturn(new User(1, "Alice"));
}
    
Test Reporting and CI/CD Integration

JUnit test results are reported in XML and HTML formats by build tools like Maven or Gradle.

Integrate with CI/CD pipelines (e.g., Jenkins, GitHub Actions) to run tests automatically on code changes.

Mockito stubbing failures cause test failures, clearly reported in test reports.

Best Practices
  • Use when().thenReturn() to stub only external dependencies, not the class under test.
  • Keep stubbing simple and focused on expected inputs and outputs.
  • Reset mocks between tests to avoid state leakage.
  • Use descriptive method names in tests to clarify what behavior is stubbed and verified.
  • Prefer explicit stubbing over default returns to catch unexpected calls.
Self Check

Question: In the folder structure shown, where would you add a new mock class for a service called PaymentService to stub its methods using when().thenReturn()?

Key Result
Organize tests with clear layers separating mocks, page objects, tests, utilities, and configuration, using when().thenReturn() to stub dependencies in JUnit tests.

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