argThat
plus Lambda
So können Sie Ihre Argumentprüfung nicht bestehen:
verify(mock).mymethod(argThat(
(x)->false
));
wo
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
argThat
plus behauptet
der obige Test wird "sagen" Expected: lambda$... Was: YourClass.toSting...
. Sie können eine spezifischere Ursache für den Fehler ermitteln, wenn Sie Asserts im Lambda verwenden:
verify(mock).mymethod(argThat( x -> {
assertThat(x).isNotNull();
assertThat(x.description).contains("KEY");
return true;
}));
ABER: DAS FUNKTIONIERT NUR MIT 1 METHODENRUF. Wenn die verifizierte Methode mehr als 2 Mal aufgerufen wird, übergibt mockito alle aufgerufenen Kombinationen an jeden Verifizierer. Mockito erwartet daher, dass Ihr Verifizierer stillschweigend true
für eines der eingestellten Argumente und false
(keine Assert-Ausnahmen) für andere gültige Aufrufe zurückgibt . Diese Erwartung ist für 1 Methodenaufruf kein Problem - sie sollte nur 1 Mal true zurückgeben.
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
Jetzt sagt der Test : Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. HINWEIS: Ich habe assertJ
Asserts verwendet, aber es liegt an Ihnen, welches Assertion-Framework verwendet werden soll.
argThat
mit mehreren Argumenten.
Wenn Sie verwenden argThat
, müssen alle Argumente mit Übereinstimmungen versehen sein. Z.B:
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.
wo:
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
eq
Matcher
Der einfachste Weg, um zu überprüfen, ob das Argument gleich ist:
verify(mock).mymethod(eq(expectedValue));
// NOTE: ^ where the parentheses must be closed.
direktes Argument
Wenn ein Vergleich mit ref akzeptabel ist, fahren Sie fort mit:
verify(mock).mymethod(expectedArg);
// NOTE: ^ where the parentheses must be closed.
Die Wurzelursache für das Versagen der ursprünglichen Frage war die falsche Stelle der Klammern : verify(mock.mymethod...
. Das war falsch. Das Recht wäre:verify(mock).*