J'ai la méthode suivante sur laquelle je souhaite vérifier le comportement.
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()));
...
}
Dans ma classe @Test, j'espérais faire quelque chose comme ça pour vérifier que cela errors.add()
est appelé avec "exception.message" et à nouveau avec "exception.detail"
verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));
cependant Mockito se plaint comme suit
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
);
Comment puis-je dire à Mockito de vérifier les deux valeurs?
Mockito.reset()
Réponses:
Une lecture plus approfondie m'a amené à essayer d'utiliser ArgumentCaptors et les travaux suivants, bien que beaucoup plus verbeux que je ne le souhaiterais.
la source
methodToTest()
exactement une fois, par conséquent, cette réponse vérifie que les deux appels sont effectués ensemble. La captureList<String> values
qui est affirmée ne contiendra que les deux valeurs testées et aucune autre. Vous pouvez également ajouterassertTrue(values.size == 2)
. Si c'est ce que vous voulez, je remplacerais les 3 déclarations assertTrue par un seul Hamcrest ...assertThat(values, contains("exception.message", "exception.detail"));
methodToTest()
une fois. C'est l'argument de la méthode quiActionErrors errors
est appelé deux fois en interne.Si l'ordre des deux
add()
appels est pertinent, vous pouvez utiliserInOrder
:la source
errors
argument:InOrder inOrder = inOrder(errors);
(voir docs )List
enSet
et affirmez que l'ensemble des entrées est égal à l'ensemble donné par l'argument capture.Essayez quelque chose comme ceci:
la source
vous avez probablement un problème dans votre code. Parce qu'en fait, vous écrivez ce code:
Notez que la première vérification n'est même pas dans l'ordre en ce qui concerne les invocations réelles.
De plus, je vous recommande de ne pas vous moquer des types que vous ne possédez pas, par exemple le type struts.
[MODIFIER @Brad]
Après avoir exécuté le code de Brice (ci-dessus) dans mon IDE, je peux voir que j'ai utilisé ActionError au lieu d'ActionMessage, c'est pourquoi mon verify () ne correspondait pas. Le message d'erreur que j'ai initialement publié m'a induit en erreur en pensant que c'était le premier argument qui ne correspondait pas. Il s'avère que c'était le deuxième argument.
Donc la réponse à ma question est
la source
InOrder
.Vous pouvez utiliser
Mockito.atLeastOnce()
ce qui permet à Mockito de passer le test même si ce mockObject sera appelé plusieurs fois.la source
1) Dites à Mokito l'attente totale des appels.
2) Dites à Mokito combien de fois chaque combinaison de paramètres était attendue.
la source
De la même manière que @ sendon1928, nous pouvons utiliser:
pour s'assurer que la méthode a été appelée le nombre exact de fois (solution préférable à mon avis). Ensuite, nous pouvons appeler
Pour s'assurer que ce simulacre n'est plus utilisé dans aucun contexte. Exemple complet:
la source