Bird
Raised Fist0
JUnittesting~20 mins

Answer interface for dynamic responses in JUnit - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Dynamic Response Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this JUnit test using dynamic response interface?
Consider a JUnit test that uses a dynamic answer interface to return different values based on input arguments. What will be the printed output after running this test?
JUnit
import org.junit.jupiter.api.Test;
import org.mockito.stubbing.Answer;
import static org.mockito.Mockito.*;

interface Service {
    String respond(String input);
}

public class DynamicAnswerTest {
    @Test
    void testDynamicAnswer() {
        Service mockService = mock(Service.class);
        when(mockService.respond(anyString())).thenAnswer((Answer<String>) invocation -> {
            String arg = invocation.getArgument(0);
            return arg.equals("hello") ? "world" : "unknown";
        });

        System.out.println(mockService.respond("hello"));
        System.out.println(mockService.respond("test"));
    }
}
Aworld\nunknown
Bhello\ntest
Cunknown\nunknown
Dworld\nworld
Attempts:
2 left
💡 Hint
Focus on how the dynamic answer checks the input argument and returns different strings.
❓ assertion
intermediate
1:30remaining
Which assertion correctly verifies a dynamic response from a mocked method?
Given a mocked service with a dynamic answer returning "success" for input "go" and "fail" otherwise, which assertion correctly verifies the response for input "go"?
JUnit
Service mockService = mock(Service.class);
when(mockService.respond(anyString())).thenAnswer(invocation -> {
    String arg = invocation.getArgument(0);
    return arg.equals("go") ? "success" : "fail";
});
AassertNull(mockService.respond("go"));
BassertTrue(mockService.respond("go").equals("fail"));
CassertEquals("success", mockService.respond("go"));
DassertFalse(mockService.respond("go").equals("success"));
Attempts:
2 left
💡 Hint
Check what the dynamic answer returns for input "go".
🔧 Debug
advanced
2:00remaining
Why does this dynamic answer cause a NullPointerException?
Examine the following code snippet. Why does calling mockService.respond(null) cause a NullPointerException?
JUnit
Service mockService = mock(Service.class);
when(mockService.respond(null)).thenAnswer(invocation -> {
    String arg = invocation.getArgument(0);
    if (arg.equals("test")) {
        return "ok";
    } else {
        return "fail";
    }
});

mockService.respond(null);
ABecause anyString() matcher does not allow null arguments.
BBecause thenAnswer cannot handle null return values.
CBecause mockService is not properly initialized.
DBecause arg is null and calling arg.equals("test") throws NullPointerException.
Attempts:
2 left
💡 Hint
Consider what happens when you call a method on a null object.
❓ framework
advanced
1:00remaining
Which Mockito feature allows dynamic responses based on method arguments?
In Mockito, which feature lets you define a method's return value dynamically depending on the input arguments during test execution?
AthenAnswer()
BthenReturn()
CdoThrow()
Dverify()
Attempts:
2 left
💡 Hint
This feature uses a callback to compute the return value.
🧠 Conceptual
expert
2:30remaining
What is the main advantage of using an Answer interface for dynamic responses in unit tests?
Why would a tester prefer using the Answer interface to provide dynamic responses in mocks instead of fixed return values?
AIt prevents any exceptions from being thrown during test execution.
BIt allows the mock to return different values based on input parameters, enabling more realistic and flexible test scenarios.
CIt improves test execution speed by caching responses.
DIt automatically generates test data without any input from the tester.
Attempts:
2 left
💡 Hint
Think about how dynamic behavior helps simulate real method calls.

Practice

(1/5)
1. What is the main purpose of the Answer interface in JUnit mocking frameworks like Mockito?
easy
A. To verify the number of method calls on a mock
B. To create static return values for mocked methods
C. To provide dynamic responses based on method input during mocking
D. To reset mocks to their original state

Solution

  1. Step 1: Understand the role of Answer interface

    The Answer interface allows you to define custom behavior for mocked methods dynamically, based on the input arguments.
  2. Step 2: Compare with other mocking features

    Static return values are simpler but less flexible. Verification and reset are different features unrelated to Answer.
  3. Final Answer:

    To provide dynamic responses based on method input during mocking -> Option C
  4. Quick Check:

    Answer interface = dynamic mock responses [OK]
Hint: Answer interface means dynamic mock responses based on input [OK]
Common Mistakes:
  • Confusing Answer with static return values
  • Mixing Answer with verification methods
  • Thinking Answer resets mocks
2. Which of the following is the correct syntax to implement the Answer interface in Mockito for a method that returns the length of a String argument?
easy
A. when(mock.method(anyString())).thenAnswer(invocation -> ((String)invocation.getArgument(0)).length());
B. when(mock.method(anyString())).thenAnswer(invocation -> invocation.length());
C. when(mock.method(anyString())).thenReturn(invocation.getArgument(0).length());
D. when(mock.method(anyString())).thenAnswer(invocation -> invocation.getArgument(1).length());

Solution

  1. Step 1: Identify correct use of thenAnswer with lambda

    thenAnswer expects a lambda with InvocationOnMock parameter; ((String)getArgument(0)) fetches first argument.
  2. Step 2: Check argument index and method calls

    Using ((String)getArgument(0)).length() correctly gets length of first String argument. The option using invocation.length() misses getArgument, the option using thenReturn is incorrect because invocation is unavailable, the option using getArgument(1) uses wrong argument index.
  3. Final Answer:

    when(mock.method(anyString())).thenAnswer(invocation -> ((String)invocation.getArgument(0)).length()); -> Option A
  4. Quick Check:

    thenAnswer + ((String)getArgument(0)) = correct syntax [OK]
Hint: Use ((String)getArgument(0)) inside thenAnswer lambda for first param [OK]
Common Mistakes:
  • Using thenReturn instead of thenAnswer for dynamic response
  • Accessing wrong argument index
  • Calling length() on invocation instead of argument
3. Given the following Mockito stub using Answer interface:
when(mock.calculate(anyInt())).thenAnswer(invocation -> {
  int x = (int) invocation.getArgument(0);
  return x * 2;
});
System.out.println(mock.calculate(5));

What will be printed?
medium
A. 5
B. Throws NullPointerException
C. 0
D. 10

Solution

  1. Step 1: Analyze the Answer implementation

    The Answer lambda takes the first argument (5), multiplies it by 2, and returns the result.
  2. Step 2: Calculate the output of mock.calculate(5)

    5 * 2 = 10, so the printed output is 10.
  3. Final Answer:

    10 -> Option D
  4. Quick Check:

    5 * 2 = 10 [OK]
Hint: Multiply input by 2 inside thenAnswer returns 10 for input 5 [OK]
Common Mistakes:
  • Assuming static return value 5
  • Confusing argument index
  • Expecting exception without cause
4. Consider this Mockito stub using Answer interface:
when(mock.concat(anyString(), anyString())).thenAnswer(invocation -> {
  String a = invocation.getArgument(0);
  String b = invocation.getArgument(1);
  return a + b;
});

Which of the following is a bug in this code?
medium
A. Missing cast to String for getArgument
B. Using getArgument with wrong index
C. Using thenAnswer instead of thenReturn
D. No bug, code works correctly

Solution

  1. Step 1: Check getArgument usage

    getArgument returns Object by default; it must be cast to String to avoid ClassCastException.
  2. Step 2: Identify missing cast

    Code assigns getArgument(0) and getArgument(1) directly to String variables without casting, which is incorrect.
  3. Final Answer:

    Missing cast to String for getArgument -> Option A
  4. Quick Check:

    getArgument needs cast to String [OK]
Hint: Always cast getArgument to expected type [OK]
Common Mistakes:
  • Ignoring required casting of getArgument
  • Thinking thenAnswer is wrong here
  • Assuming getArgument returns typed value
5. You want to mock a method process(int a, int b) so that it returns the sum of the two arguments only if both are positive; otherwise, it returns zero. Which is the best way to implement this using the Answer interface in Mockito?
hard
A. Use thenReturn(0) for all calls and verify arguments separately
B. Use thenAnswer with a lambda that checks both arguments and returns sum or zero accordingly
C. Use thenAnswer with a lambda that always returns the first argument
D. Use thenThrow to throw exception if arguments are negative

Solution

  1. Step 1: Understand requirement for conditional return

    The method must return sum if both inputs are positive, else zero, which requires dynamic logic.
  2. Step 2: Choose correct Answer implementation

    Using thenAnswer with a lambda that checks both arguments and returns sum or zero fits perfectly. Other options either ignore conditions or throw exceptions unnecessarily.
  3. Final Answer:

    Use thenAnswer with a lambda that checks both arguments and returns sum or zero accordingly -> Option B
  4. Quick Check:

    Conditional logic in thenAnswer = Use thenAnswer with a lambda that checks both arguments and returns sum or zero accordingly [OK]
Hint: Use thenAnswer with conditional logic for dynamic return [OK]
Common Mistakes:
  • Using thenReturn for conditional logic
  • Ignoring argument checks
  • Throwing exceptions instead of returning zero
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