We use an Answer interface to create flexible responses in tests. It helps simulate different behaviors dynamically.
Answer interface for dynamic responses in JUnit
Answer<Type> answer = invocation -> {
// your dynamic response logic here
return value;
};The Answer interface is a functional interface with one method: Object answer(InvocationOnMock invocation).
You implement the answer method to define what the mock should return when called.
Answer<String> answer = invocation -> "Hello " + invocation.getArgument(0);
Answer<Integer> answer = invocation -> {
int a = invocation.getArgument(0);
int b = invocation.getArgument(1);
return a + b;
};This test mocks a Calculator interface. The add method returns the sum of its two arguments dynamically using the Answer interface. The assertions check that the mock returns correct sums for different inputs.
import static org.mockito.Mockito.*; import org.mockito.stubbing.Answer; import org.mockito.invocation.InvocationOnMock; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; interface Calculator { int add(int a, int b); } public class AnswerInterfaceTest { @Test void testDynamicAdd() { Calculator calc = mock(Calculator.class); Answer<Integer> addAnswer = invocation -> { int a = invocation.getArgument(0); int b = invocation.getArgument(1); return a + b; }; when(calc.add(anyInt(), anyInt())).thenAnswer(addAnswer); assertEquals(5, calc.add(2, 3)); assertEquals(0, calc.add(-1, 1)); assertEquals(10, calc.add(7, 3)); } }
Use invocation.getArgument(index) to access method parameters inside the Answer.
Answer interface helps avoid writing many separate stubs for different inputs.
Remember to import Mockito and JUnit 5 libraries to run the example.
The Answer interface lets you create dynamic mock responses based on input.
It is useful for simulating complex or variable behavior in tests.
Using Answer improves test flexibility and reduces repetitive code.
Practice
Answer interface in JUnit mocking frameworks like Mockito?Solution
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.Step 2: Compare with other mocking features
Static return values are simpler but less flexible. Verification and reset are different features unrelated to Answer.Final Answer:
To provide dynamic responses based on method input during mocking -> Option CQuick Check:
Answer interface = dynamic mock responses [OK]
- Confusing Answer with static return values
- Mixing Answer with verification methods
- Thinking Answer resets mocks
Answer interface in Mockito for a method that returns the length of a String argument?Solution
Step 1: Identify correct use of thenAnswer with lambda
thenAnswer expects a lambda with InvocationOnMock parameter; ((String)getArgument(0)) fetches first argument.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.Final Answer:
when(mock.method(anyString())).thenAnswer(invocation -> ((String)invocation.getArgument(0)).length()); -> Option AQuick Check:
thenAnswer + ((String)getArgument(0)) = correct syntax [OK]
- Using thenReturn instead of thenAnswer for dynamic response
- Accessing wrong argument index
- Calling length() on invocation instead of argument
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?
Solution
Step 1: Analyze the Answer implementation
The Answer lambda takes the first argument (5), multiplies it by 2, and returns the result.Step 2: Calculate the output of mock.calculate(5)
5 * 2 = 10, so the printed output is 10.Final Answer:
10 -> Option DQuick Check:
5 * 2 = 10 [OK]
- Assuming static return value 5
- Confusing argument index
- Expecting exception without cause
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?
Solution
Step 1: Check getArgument usage
getArgument returns Object by default; it must be cast to String to avoid ClassCastException.Step 2: Identify missing cast
Code assigns getArgument(0) and getArgument(1) directly to String variables without casting, which is incorrect.Final Answer:
Missing cast to String for getArgument -> Option AQuick Check:
getArgument needs cast to String [OK]
- Ignoring required casting of getArgument
- Thinking thenAnswer is wrong here
- Assuming getArgument returns typed value
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?Solution
Step 1: Understand requirement for conditional return
The method must return sum if both inputs are positive, else zero, which requires dynamic logic.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.Final Answer:
Use thenAnswer with a lambda that checks both arguments and returns sum or zero accordingly -> Option BQuick Check:
Conditional logic in thenAnswer = Use thenAnswer with a lambda that checks both arguments and returns sum or zero accordingly [OK]
- Using thenReturn for conditional logic
- Ignoring argument checks
- Throwing exceptions instead of returning zero
Ready to prove it?
Pass the test and this pattern moves unknown
