public class ArgumentCaptor<T> extends Object
Mockito verifies argument values in natural java style: by using an equals() method. This is also the recommended way of matching arguments because it makes tests clean & simple. In some situations though, it is helpful to assert on certain arguments after the actual verification. For example:
ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class); verify(mock).doSomething(argument.capture()); assertEquals("John", argument.getValue().getName());
Warning: it is recommended to use ArgumentCaptor with verification but not with stubbing. Using ArgumentCaptor with stubbing may decrease test readability because captor is created outside of assert (aka verify or 'then') block. Also it may reduce defect localization because if stubbed method was not called then no argument is captured.
In a way ArgumentCaptor is related to custom argument matchers (see javadoc for ArgumentMatcher
class).
Both techniques can be used for making sure certain arguments where passed to mocks.
However, ArgumentCaptor may be a better fit if:
ArgumentMatcher
are usually better for stubbing.
There is an annotation that you might find useful: @Captor
See the full documentation on Mockito in javadoc for Mockito
class.
Constructor and Description |
---|
ArgumentCaptor()
Deprecated.
Please use factory method
forClass(Class) to create captors
This is required to avoid NullPointerExceptions when autoUnboxing primitive types. See issue 99. Example: ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class); verify(mock).doSomething(argument.capture()); assertEquals("John", argument.getValue().getName()); |
Modifier and Type | Method and Description |
---|---|
T |
capture()
Use it to capture the argument.
|
static <T> ArgumentCaptor<T> |
forClass(Class<T> clazz) |
List<T> |
getAllValues()
Returns all captured values.
|
T |
getValue()
Returns the captured value of the argument.
|
@Deprecated public ArgumentCaptor()
forClass(Class)
to create captors
This is required to avoid NullPointerExceptions when autoUnboxing primitive types. See issue 99.
Example:
ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class); verify(mock).doSomething(argument.capture()); assertEquals("John", argument.getValue().getName());
public T capture()
Internally, this method registers a special implementation of an ArgumentMatcher
.
This argument matcher stores the argument value so that you can use it later to perform assertions.
See examples in javadoc for ArgumentCaptor
class.
public T getValue()
If the method was called multiple times then it returns the latest captured value
See examples in javadoc for ArgumentCaptor
class.
public List<T> getAllValues()
Example:
ArgumentCaptor<Person> peopleCaptor = ArgumentCaptor.forClass(Person.class); verify(mock, times(2)).doSomething(peopleCaptor.capture()); List<Person> capturedPeople = peopleCaptor.getAllValues(); assertEquals("John", capturedPeople.get(0).getName()); assertEquals("Jane", capturedPeople.get(1).getName());See more examples in javadoc for
ArgumentCaptor
class.public static <T> ArgumentCaptor<T> forClass(Class<T> clazz)
Copyright © 2018. All rights reserved.