Utilisation Mockito vérifier que rien n'est appelée après la méthode
Je suis en utilisant Mockito d'écrire un test unitaire en Java, et j'aimerais vérifier qu'une certaine méthode est la dernier appelée sur un objet.
Je suis en train de faire quelque chose comme ceci dans le code en cours de test:
row.setSomething(value);
row.setSomethingElse(anotherValue);
row.editABunchMoreStuff();
row.saveToDatabase();
Dans ma maquette, je ne se soucient pas de l'ordre dans lequel j'ai tout modifier sur la ligne, mais il est très important que je pas essayer de faire quelque chose de plus après que j'ai enregistré. Est-il une bonne façon de le faire?
Remarque que je ne suis pas à la recherche pour verifyNoMoreInteractions: il n'est pas en mesure de confirmer que saveToDatabase est la dernière chose qui s'appelle, et il échoue également si je l'appelle, rien sur la ligne que je n'ai pas explicitement vérifier. Je voudrais être en mesure de dire quelque chose comme:
verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verifyTheLastThingCalledOn(row).saveToDatabase();
Si cela peut aider, je suis passer à Mockito à partir d'un JMock test qui a fait ceci:
row.expects(once()).method("saveToDatabase").id("save");
row.expects(never()).method(ANYTHING).after("save");
- Une note de l'avenir: nous avons finalement refait ceci afin d'éviter la dépendance de l'ordre. Plus précisément, nous avons déplacé le saveToDatabase() d'une part, la couche extérieure du code, où il serait automatiquement appelé au bon moment. En général, si vous avez besoin de faire quelque chose comme ceci avec un simulacre, vos tests sont en train de vous dire de refactoriser. Cela dit, il est toujours agréable d'avoir un test qui peut fonctionner jusqu'à ce que la conception est modifiée.
Vous devez vous connecter pour publier un commentaire.
Je pense qu'il exige plus de travail personnalisé.
et puis
Réponse Précédente:
Vous avez raison. verifyNoMoreInteractions est ce que vous avez besoin.
matcher
Pas à 100% sur le sujet, mais je viens de regarder pour trouver le contraire de vérifier, et c'était le seul résultat, il finit, j'étais après Mockito.verifyZeroInteractions(mock);
Juste au cas où quelqu'un d'autre, se termine ici à la recherche de ce...
Cette question m'a amené à faire quelques améliorations à la Vérifications API dans JMockit (disponible dans la prochaine version 0.983).
La solution je suis venu avec vous permet d'écrire (dans une méthode de test):
... si vous voulez seulement vérifier qu'une méthode est appelée après que tout le reste. Pour vérifier, il arrive avant toutes les autres invocations, il suffit de déplacer l'appel vers le haut. Cela s'applique en fait à toute séquence d'consécutives invocations.
Si, en outre, à la vérification, vous aussi vous voulez vérifier que certaines autres méthodes sont appelées dans un ordre quelconque, un deuxième vérifications le bloc peut être ajouté à l'épreuve (avant ou après l'autre bloc, il n'a pas d'importance):
Bien qu'un peu long en raison de l'utilisation de anonyme les classes internes, cette syntaxe est à la fois simple et flexible; remarquez comment il ajoute de la structure à l'épreuve et évite la répétition des appels de méthode (comme
verify(...)
). Il n'y a plus à ce que j'ai décrit ici (Hamcrest de rapprochement, l'invocation de compte, etc.), et il n'est pas limité à la vérification des méthodes d'instance (méthodes statiques et les constructeurs peuvent se moque de lui et vérifiée de la même façon).