Ich habe die folgende Methode, mit der ich das Verhalten überprüfen möchte
public void methodToTest( Exception e, ActionErrors errors ) {
...
errors.add( "exception.message",
ActionMessageFactory.createErrorMessage(e.toString() ));
errors.add( "exception.detail",
ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString() ));
...
}
In meiner @ Test-Klasse hatte ich gehofft, so etwas zu tun, um zu überprüfen, ob der errors.add()
Aufruf mit "exception.message" und erneut mit "exception.detail" erfolgt.
verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));
Mockito beschwert sich jedoch wie folgt
Argument(s) are different! Wanted:
actionErrors.add(
"exception.message",
<any>
);
Actual invocation has different arguments:
actionErrors.add(
"exception.detail",
org.apache.struts.action.ActionError@38063806
);
Wie kann ich Mockito anweisen, nach beiden Werten zu suchen?
Mockito.reset()
Antworten:
Weiterführende Literatur hat mich veranlasst, ArgumentCaptors und die folgenden Werke zu verwenden, obwohl sie viel ausführlicher sind, als ich es gerne hätte.
quelle
methodToTest()
genau einmal auf, daher bestätigt diese Antwort, dass die beiden Anrufe zusammen getätigt werden. Das erfassteList<String> values
Capture enthält nur die beiden getesteten Werte und keine anderen. Sie könnten auch hinzufügenassertTrue(values.size == 2)
. Wenn Sie dies möchten, würde ich die 3 assertTrue-Anweisungen durch ein einzelnes Hamcrest ersetzen ...assertThat(values, contains("exception.message", "exception.detail"));
methodToTest()
einmal aufgerufen. Es ist das Methodenargument,ActionErrors errors
das intern zweimal aufgerufen wird.Wenn die Reihenfolge von beiden
add()
Anrufe relevant ist, können Sie Folgendes verwendenInOrder
:quelle
errors
Argument zu übergeben:InOrder inOrder = inOrder(errors);
(siehe Dokumente )List
inSet
und versichern Sie, dass die Menge der Eingaben der Menge entspricht, die durch die Argumenterfassung angegeben wird.Versuchen Sie so etwas:
quelle
Sie haben wahrscheinlich ein Problem in Ihrem Code. Denn tatsächlich schreiben Sie diesen Code tatsächlich:
Beachten Sie, dass die erste Überprüfung nicht einmal in Bezug auf die tatsächlichen Aufrufe erfolgt.
Außerdem würde ich Ihnen empfehlen, keine Typen zu verspotten, die Sie nicht besitzen, z. B. den Strebentyp.
[EDIT @Brad]
Nachdem ich Brices Code (oben) in meiner IDE ausgeführt habe, kann ich feststellen, dass ich ActionError anstelle von ActionMessage verwendet habe. Aus diesem Grund stimmte mein verify () nicht überein. Die Fehlermeldung, die ich ursprünglich gepostet habe, hat mich irregeführt, dass es das erste Argument war, das nicht übereinstimmte. Es stellte sich heraus, dass es das zweite Argument war.
Die Antwort auf meine Frage lautet also
quelle
InOrder
.Sie können verwenden
Mockito.atLeastOnce()
, wodurch Mockito den Test bestehen kann, auch wenn dieses mockObject mehrmals aufgerufen wird.quelle
1) Teilen Sie Mokito die gesamte Anruferwartung mit.
2) Sagen Sie Mokito, wie oft jede Parameterkombination erwartet wurde.
quelle
Ähnlich wie bei @ sendon1928 können wir Folgendes verwenden:
um sicherzustellen, dass die Methode genau so oft aufgerufen wurde (meiner Meinung nach bevorzugte Lösung). Danach können wir anrufen
Um sicherzustellen, dass Mock in keinem Zusammenhang weiter verwendet wurde. Vollständiges Beispiel:
quelle