web-dev-qa-db-fra.com

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 je voudrais vérifier qu'une certaine méthode est la la dernière appelée sur un objet.

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

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

Dans ma maquette, je ne me soucie pas de l'ordre dans lequel je modifie tout sur la ligne, mais il est très important que j'pas essaie de faire quoi que ce soit de plus 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 également si j'appelle quelque chose sur la ligne que je ne vérifie pas explicitement. Je voudrais pouvoir dire quelque chose comme:

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

Si cela aide, je passe à Mockito à partir d'un test JMock qui a fait ceci:

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

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

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 (!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);
56
Kent Lai

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

Au cas où quelqu'un d'autre finirait par chercher ça ...

11
Grofit