argThat
más lambda
así es como puede fallar la verificación de su argumento:
verify(mock).mymethod(argThat(
(x)->false
));
dónde
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
argThat
más afirma
la prueba anterior "dirá" Expected: lambda$... Was: YourClass.toSting...
. Puede obtener una causa más específica de la falla si usa afirmaciones en la lambda:
verify(mock).mymethod(argThat( x -> {
assertThat(x).isNotNull();
assertThat(x.description).contains("KEY");
return true;
}));
PERO: ESTO SOLO FUNCIONA CON 1 LLAMADA DE MÉTODO. Si el método verificado se llama 2 o más veces, mockito pasa todas las combinaciones llamadas a cada verificador. Entonces, mockito espera que su verificador regrese silenciosamente true
para uno de los argumentos establecidos y false
(sin excepciones de afirmación) para otras llamadas válidas. Esa expectativa no es un problema para 1 llamada al método, solo debe devolver 1 vez verdadero.
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
Ahora la prueba dice: Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. NOTA: Utilicé assertJ
afirmaciones, pero depende de usted qué marco de afirmación usar.
argThat
con múltiples argumentos
Si usa argThat
, todos los argumentos deben ser provistos con coincidencias. P.ej:
verify(mock).mymethod(eq("VALUE_1"), argThat((x)->false));
// above is correct as eq() is also an argument matcher.
verify(mock).mymethod("VALUE_1", argThat((x)->false));
// above is incorrect; an exceptoin will be thrown, as the fist arg. is given without an argument matcher.
dónde:
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
eq
matcher
La forma más fácil de verificar si el argumento es igual:
verify(mock).mymethod(eq(expectedValue));
// NOTE: ^ where the parentheses must be closed.
argumento directo
Si la comparación por referencia es aceptable, continúe con:
verify(mock).mymethod(expectedArg);
// NOTE: ^ where the parentheses must be closed.
La causa fundamental del fracaso pregunta original era el lugar equivocado de las paranthes: verify(mock.mymethod...
. Eso estuvo mal. El derecho sería:verify(mock).*