argThat
plus lambda
voici comment échouer la vérification de votre argument:
verify(mock).mymethod(argThat(
(x)->false
));
où
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
argThat
plus affirme
le test ci-dessus "dira" Expected: lambda$... Was: YourClass.toSting...
. Vous pouvez obtenir une cause plus spécifique de l'échec si vous utilisez des assertions dans le lambda:
verify(mock).mymethod(argThat( x -> {
assertThat(x).isNotNull();
assertThat(x.description).contains("KEY");
return true;
}));
MAIS: CECI NE FONCTIONNE QUE AVEC 1 APPEL DE MÉTHODE. Si la méthode vérifiée est appelée au moins 2 fois, mockito transmet toutes les combinaisons appelées à chaque vérificateur. Donc, mockito s'attend à ce que votre vérificateur retourne silencieusement true
pour l'un des ensembles d'arguments et false
(sans exception d'affirmation) pour les autres appels valides. Cette attente n'est pas un problème pour 1 appel de méthode - elle devrait simplement renvoyer true 1 fois.
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
Maintenant , le test dit: Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. REMARQUE: j'ai utilisé des assertJ
assertions, mais c'est à vous de choisir le cadre d'assertion à utiliser.
argThat
avec plusieurs arguments.
Si vous utilisez argThat
, tous les arguments doivent être fournis avec des correspondances. Par exemple:
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.
où:
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
eq
matcher
la façon la plus simple de vérifier si l'argument est égal:
verify(mock).mymethod(eq(expectedValue));
// NOTE: ^ where the parentheses must be closed.
argument direct
si la comparaison par référence est acceptable, alors continuez avec:
verify(mock).mymethod(expectedArg);
// NOTE: ^ where the parentheses must be closed.
LA CAUSE ROOT de l' échec de la question initiale était au mauvais endroit des paranthes: verify(mock.mymethod...
. C'était faux. Le droit serait:verify(mock).*