47 votes

Utilisez Mockito pour vérifier que rien n'est appelé après une méthode

Je suis l'aide de Mockito d'écrire un test unitaire en Java, et j'aimerais vérifier qu'une certaine méthode est la dernière 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 c'est très important pour moi de ne pas essayer de faire quelque chose de plus après que j'ai enregistré. Est-il une bonne façon de le faire?

Notez 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");

56voto

Kent Lai Points 841

Je pense que cela nécessite plus de travail sur mesure.

 verify(row, new LastCall()).saveToDatabase();
 

puis

 public class LastCall implements VerificationMode {
    public void verify(VerificationData data) {
    	List<Invocation> invocations = data.getAllInvocations()
    	InvocationMatcher matcher = data.getWanted();
    	Invocation invocation = invocations.get(invocations.size() - 1);
    	if (!wanted.matches(invocation)) throw new MockitoException("...");
    }
}
 

Réponse précédente:

Tu as raison. verifyNoMoreInteractions est ce dont vous avez besoin.

 verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verify(row).editABunchMoreStuff();
verify(row).saveToDatabase();
verifyNoMoreInteractions(row);
 

11voto

Grofit Points 3036

Pas à 100% sur le sujet, mais je cherchais simplement à trouver le contraire de verifier, et c’était le seul résultat pertinent, c’est que j’étais après Mockito.verifyZeroInteractions (mock);

Juste au cas où quelqu'un d'autre finit ici à la recherche de ceci ...

0voto

Nerdfest Points 1428

Pouvez-vous faire en sorte que votre appel à "enregistrer" supprime toutes les autres attentes?

0voto

Rogério Points 5460

Cette question m'a amené à faire quelques améliorations pour les Vérifications de l'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):


    new VerificationsInOrder() {{
        unverifiedInvocations();
        row.saveToDababase();
    }};

... si vous voulez seulement vérifier qu'une méthode est appelée après que tout le reste. Pour vérifier ce qui se passe 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 bloc peut être ajouté à l'épreuve (avant ou après l'autre bloc, il n'a pas d'importance):


    new Verifications() {{
        row.setSomething(value);
        row.setSomethingElse(anotherValue);
    }};

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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X