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

J’utilise Mockito pour écrire un test unitaire en Java et j’aimerais vérifier qu’une certaine méthode est la dernière appelée sur un object.

Je fais quelque chose comme ça dans le code sous test:

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

Dans mon simulacre, je ne me soucie pas de l’ordre dans lequel je modifie tout sur la rangée, mais il est très important que je n’essaie plus de faire quoi que ce soit après l’avoir enregistré. Y at-il un bon moyen de le faire?

Notez que je ne recherche pas verifyNoMoreInteractions: cela ne confirme pas que saveToDatabase est la dernière chose appelée, et il échoue aussi si j’appelle quelque chose sur la ligne que je ne vérifie pas explicitement. J’aimerais pouvoir dire quelque chose comme:

 verify(row).setSomething(value); verify(row).setSomethingElse(anotherValue); verifyTheLastThingCalledOn(row).saveToDatabase(); 

Si cela vous aide, je passe de Mockito à un test JMock qui a fait ceci:

 row.expects(once()).method("saveToDatabase").id("save"); row.expects(never()).method(ANYTHING).after("save"); 

Je pense que cela nécessite plus de travail personnalisé.

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

et alors

 public class LastCall implements VerificationMode { public void verify(VerificationData data) { List invocations = data.getAllInvocations(); InvocationMatcher matcher = data.getWanted(); Invocation invocation = invocations.get(invocations.size() - 1); if (!matcher.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); 

Pas à 100% sur le sujet mais je cherchais juste à trouver le contraire de vérifier, et c’était le seul résultat pertinent, il finit par être après Mockito.verifyZeroInteractions (mock);

Juste au cas où quelqu’un d’autre finit par chercher ici …

Cette question m’a amené à apporter des améliorations à l’API de vérification dans JMockit (disponible dans la prochaine version 0.983).

La solution que j’ai proposée vous permet d’écrire (dans une méthode de test):

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

… si vous voulez seulement vérifier qu’une certaine méthode est appelée après tout le rest. Pour vérifier que cela se produit avant toutes les autres invocations, déplacez simplement l’appel vers le haut. Cela s’applique effectivement à toute séquence d’invocations consécutives.

Si en plus de la vérification ci-dessus, vous souhaitez également vérifier que d’autres méthodes sont appelées dans n’importe quel ordre, un deuxième bloc de vérification peut être ajouté au test (avant ou après l’autre bloc, peu importe):

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

Bien qu’elle soit un peu longue en raison de l’utilisation de classes internes anonymes, cette syntaxe est à la fois simple et flexible; remarquez comment il ajoute de la structure au test et évite la répétition des appels de méthode (comme verify(...) ). Il y a plus que ce que j’ai décrit ici (matchers Hamcrest, nombre d’invocations, etc.), et cela ne se limite pas à la vérification des méthodes d’instance (les méthodes statiques et les constructeurs peuvent être moqués et vérifiés de la même manière).