What is the purpose of the Answer interface in JUnit testing?
The Answer interface allows you to define dynamic responses for mocked methods, enabling custom behavior when a method is called during a test.
Click to reveal answer
intermediate
How do you implement the Answer interface to return a value based on method arguments?
Implement the Answer interface's answer(InvocationOnMock invocation) method, extract arguments from invocation.getArguments(), and return a value computed from those arguments.
Click to reveal answer
beginner
Which method must be overridden when using the Answer interface?
You must override the answer(InvocationOnMock invocation) method to define the behavior of the mocked method call.
Click to reveal answer
intermediate
Why use Answer interface instead of simple when().thenReturn() in Mockito?
Answer interface is used when the return value depends on the input arguments or when you want to execute custom logic on method calls, which thenReturn() cannot handle.
Click to reveal answer
intermediate
Show a simple example of using Answer interface to return the sum of two integer arguments.
Example:
Answer<Integer> sumAnswer = invocation -> {
int a = (int) invocation.getArgument(0);
int b = (int) invocation.getArgument(1);
return a + b;
};
when(mockedObject.add(anyInt(), anyInt())).thenAnswer(sumAnswer);
Click to reveal answer
What does the Answer interface's answer() method receive as a parameter?
AThe InvocationOnMock object representing the method call
BThe method's return value
CThe mock object itself
DThe test class instance
✗ Incorrect
The answer() method receives an InvocationOnMock object, which provides details about the method call, including arguments.
When should you prefer using Answer interface over thenReturn() in Mockito?
AWhen the return value is always constant
BWhen you want to throw an exception
CWhen you want to verify method calls
DWhen the return value depends on method arguments
✗ Incorrect
Answer interface is useful when the return value depends on the input arguments, allowing dynamic responses.
Which of the following is a valid way to get the first argument inside answer() method?
Ainvocation.getMethodName()
Binvocation.getReturnValue()
Cinvocation.getArgument(0)
Dinvocation.getMock()
✗ Incorrect
invocation.getArgument(0) returns the first argument passed to the mocked method.
What type of object is typically returned by the answer() method?
Avoid
BAny object matching the mocked method's return type
COnly String objects
DOnly primitive types
✗ Incorrect
The answer() method must return an object compatible with the mocked method's return type.
Which Mockito method is used to apply an Answer to a mocked method?
Awhen().thenAnswer()
Bverify()
Cwhen().thenReturn()
Dmock()
✗ Incorrect
Use when().thenAnswer() to specify a dynamic response using the Answer interface.
Explain how the Answer interface helps create dynamic responses in Mockito tests.
Think about how you can customize what a mock returns based on input.
You got /4 concepts.
Describe a scenario where using Answer interface is better than thenReturn() for mocking.
Consider when the output changes with different inputs.
You got /3 concepts.
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
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 C
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
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 A
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
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 D
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
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 A
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
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 B
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 unknownstrongwhile earning +1 Grip toward your certificate.