Tengo un método que se llama dos veces y quiero capturar el argumento de la segunda llamada al método.
Esto es lo que he intentado:
ArgumentCaptor<Foo> firstFooCaptor = ArgumentCaptor.forClass(Foo.class);
ArgumentCaptor<Foo> secondFooCaptor = ArgumentCaptor.forClass(Foo.class);
verify(mockBar).doSomething(firstFooCaptor.capture());
verify(mockBar).doSomething(secondFooCaptor.capture());
// then do some assertions on secondFooCaptor.getValue()
Pero obtengo una TooManyActualInvocations
excepción, ya que Mockito piensa que doSomething
solo debería llamarse una vez.
¿Cómo puedo verificar el argumento de la segunda llamada de doSomething
?
java
unit-testing
mocking
mockito
Eric Wilson
fuente
fuente
doSomething()
en cada invocación por separado con esto?Person person = new Person("John"); doSomething(person); person.setName("Jane"); doSomething(person);
el argumento capturado será el mismo dos veces (porque en realidad es el mismo objeto de persona), por lo tantocapturedPeople.get(0).getName() == capturedPeople.get(1).getName() == "Jane"
, consulte también groups.google.com/forum/#!msg/mockito/ KBRocVedYT0 / 5HtARMl9r2wJ .Runnable
) y, si es necesario, haría una verificación de tipo más específica en el argumento capturado.Desde Mockito 2.0 también existe la posibilidad de utilizar el método estático Matchers.argThat (ArgumentMatcher) . Con la ayuda de Java 8, ahora es mucho más limpio y legible escribir:
Si está atado a una versión inferior de Java, también hay no tan malo:
Por supuesto, ninguno de ellos puede verificar el orden de las llamadas, para lo cual debe usar InOrder :
Eche un vistazo al proyecto mockito-java8 que hace posible realizar llamadas como:
fuente
CharSequence
. ¿Conoce alguna forma de hacer que el informe imprima el argumento "deseado" correctamente?Si no desea validar todas las llamadas
doSomething()
, solo la última, puede usarlasArgumentCaptor.getValue()
. Según el Mockito javadoc :Si el método se llamó varias veces, devuelve el último valor capturado
Entonces esto funcionaría (se supone que
Foo
tiene un métodogetName()
):fuente
También puede usar @Captor anotado ArgumentCaptor. Por ejemplo:
fuente
Con las lambdas de Java 8, una forma conveniente es usar
fuente
En primer lugar: siempre debe importar mockito static, de esta manera el código será mucho más legible (e intuitivo); los ejemplos de código a continuación requieren que funcione:
En el método verificar () puede pasar el ArgumentCaptor para asegurar la ejecución en la prueba y el ArgumentCaptor para evaluar los argumentos:
Se puede acceder a la lista de todos los argumentos pasados durante su prueba a través del método argumento.getAllValues ().
Se puede acceder al valor del argumento único (último llamado) a través del argumento.getValue () para una mayor manipulación / verificación o lo que sea que desee hacer.
fuente