Bird
Raised Fist0
JUnittesting~5 mins

Argument captors in JUnit - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is an argument captor in unit testing?
An argument captor is a tool used in unit testing to capture the arguments passed to a mock method, so you can inspect or assert their values later.
Click to reveal answer
beginner
How do you declare an argument captor in JUnit with Mockito?
You declare it using @Captor annotation or by calling ArgumentCaptor.forClass(ClassName.class). For example: @Captor ArgumentCaptor<String> captor;
Click to reveal answer
intermediate
Why use argument captors instead of verifying method calls directly?
Argument captors let you check the exact values passed to a method, especially when you want to assert on complex objects or multiple calls, which simple verification cannot do.
Click to reveal answer
intermediate
Show a simple example of capturing an argument with Mockito in JUnit.
Example: 1. Declare captor: @Captor ArgumentCaptor<String> captor; 2. Call method on mock. 3. Verify and capture: verify(mock).method(captor.capture()); 4. Assert: assertEquals("expected", captor.getValue());
Click to reveal answer
intermediate
Can argument captors capture multiple arguments from multiple calls?
Yes, argument captors can capture all arguments from multiple calls using captor.getAllValues(), which returns a list of all captured arguments in order.
Click to reveal answer
What is the main purpose of an argument captor in unit testing?
ATo capture and inspect arguments passed to mock methods
BTo create mock objects automatically
CTo verify the number of times a method was called
DTo generate test data
Which Mockito annotation is used to declare an argument captor?
A@Mock
B@Spy
C@InjectMocks
D@Captor
How do you retrieve all captured arguments from an argument captor?
Acaptor.getValue()
Bcaptor.getAllValues()
Ccaptor.values()
Dcaptor.captureAll()
Which of the following is NOT a benefit of using argument captors?
AVerifying method call count
BInspecting complex argument values
CCapturing arguments from multiple calls
DAsserting on argument properties
In Mockito, after capturing an argument, how do you verify the method was called with that argument?
Averify(mock).method(captor.getValue())
Bcaptor.verify(mock).method()
Cverify(mock).method(captor.capture())
Dmock.verify(captor.capture())
Explain what an argument captor is and why it is useful in unit testing with mocks.
Think about how you check what data a mock method received.
You got /3 concepts.
    Describe the steps to use an argument captor in a JUnit test with Mockito.
    Consider the flow from setup to assertion.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using an ArgumentCaptor in JUnit tests with Mockito?
      easy
      A. To capture and inspect the arguments passed to a mocked method
      B. To create a mock object for testing
      C. To verify the number of times a method was called
      D. To stub the return value of a method

      Solution

      1. Step 1: Understand ArgumentCaptor role

        An ArgumentCaptor is used to catch the actual arguments passed to a mock's method during test execution.
      2. Step 2: Differentiate from other Mockito features

        Unlike mocks or verify count, ArgumentCaptor focuses on capturing and inspecting method arguments.
      3. Final Answer:

        To capture and inspect the arguments passed to a mocked method -> Option A
      4. Quick Check:

        ArgumentCaptor captures arguments [OK]
      Hint: ArgumentCaptor catches method inputs for checking [OK]
      Common Mistakes:
      • Confusing ArgumentCaptor with mock creation
      • Thinking it counts method calls
      • Assuming it stubs return values
      2. Which of the following is the correct way to declare an ArgumentCaptor for a String argument in JUnit with Mockito?
      easy
      A. ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
      B. ArgumentCaptor captor = new ArgumentCaptor<String>();
      C. ArgumentCaptor<String> captor = new ArgumentCaptor<>();
      D. ArgumentCaptor<String> captor = ArgumentCaptor.capture(String.class);

      Solution

      1. Step 1: Recall ArgumentCaptor creation syntax

        The correct way is to use the static method forClass() with the class type.
      2. Step 2: Check each option for syntax correctness

        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); uses ArgumentCaptor.forClass(String.class), which is correct. Options B and C incorrectly use constructors, which are not public. ArgumentCaptor<String> captor = ArgumentCaptor.capture(String.class); uses a non-existent method capture() for creation.
      3. Final Answer:

        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); -> Option A
      4. Quick Check:

        Use forClass() to create captor [OK]
      Hint: Use ArgumentCaptor.forClass(Type.class) to declare captor [OK]
      Common Mistakes:
      • Trying to instantiate ArgumentCaptor with new
      • Using non-existent capture() method
      • Omitting the class type in forClass()
      3. Given the following code snippet, what will be the captured argument value?
      List<String> list = mock(List.class);
      ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
      list.add("hello");
      verify(list).add(captor.capture());
      String captured = captor.getValue();
      medium
      A. null
      B. "hello"
      C. "captor"
      D. Throws an exception

      Solution

      1. Step 1: Understand the mock and method call

        The mock list has add("hello") called, so "hello" is passed as argument.
      2. Step 2: Verify and capture argument

        The verify(list).add(captor.capture()) captures the argument passed to add(), which is "hello".
      3. Final Answer:

        "hello" -> Option B
      4. Quick Check:

        Captured argument matches method call input [OK]
      Hint: Captured value equals argument passed to mock method [OK]
      Common Mistakes:
      • Assuming captor captures method name
      • Expecting null if not stubbed
      • Thinking it throws exception without stubbing
      4. Identify the error in the following test code using ArgumentCaptor:
      ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class);
      verify(mockedList).add(captor.capture());
      mockedList.add(5);
      Integer value = captor.getValue();
      medium
      A. ArgumentCaptor should be declared after method call
      B. No error, code is correct
      C. Captor must be reset before use
      D. The verify call is before the actual method call

      Solution

      1. Step 1: Analyze order of method call and verify

        The verify() call must come after the actual method call to check interactions.
      2. Step 2: Identify the mistake

        Here, verify() is called before mockedList.add(5), so no interaction is recorded yet.
      3. Final Answer:

        The verify call is before the actual method call -> Option D
      4. Quick Check:

        Verify after method call [OK]
      Hint: Always call verify() after the method under test [OK]
      Common Mistakes:
      • Calling verify before method invocation
      • Assuming captor resets automatically
      • Declaring captor after verify
      5. You want to verify that a mocked service method was called twice with different String arguments, and capture both arguments for assertions. Which approach correctly uses ArgumentCaptor to achieve this?
      hard
      A. Use ArgumentCaptor only once; it cannot capture multiple calls
      B. Create two separate ArgumentCaptors and verify each call separately
      C. Use a single ArgumentCaptor and call getAllValues() after verifying two calls
      D. Capture arguments by stubbing the method instead of verify

      Solution

      1. Step 1: Understand multiple call verification with ArgumentCaptor

        A single ArgumentCaptor can capture all arguments from multiple calls using getAllValues().
      2. Step 2: Evaluate options for capturing multiple arguments

        Use a single ArgumentCaptor and call getAllValues() after verifying two calls correctly uses one captor and retrieves all captured arguments. Create two separate ArgumentCaptors and verify each call separately is unnecessary and verbose. Use ArgumentCaptor only once; it cannot capture multiple calls is false; captor supports multiple captures. Capture arguments by stubbing the method instead of verify is incorrect because stubbing does not capture arguments.
      3. Final Answer:

        Use a single ArgumentCaptor and call getAllValues() after verifying two calls -> Option C
      4. Quick Check:

        Single captor + getAllValues() captures multiple calls [OK]
      Hint: Use getAllValues() on one captor for multiple calls [OK]
      Common Mistakes:
      • Creating multiple captors unnecessarily
      • Thinking captor captures only one call
      • Trying to capture arguments via stubbing
      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