Frage

Ich bin Mockito mit einem Unit-Test in Java zu schreiben, und ich würde überprüfen mag, dass eine bestimmte Methode der letzte ist auf einem Objekt aufgerufen.

Ich mache so etwas wie dies in dem im Test befindlichen Code:

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

In meinem Mock, ich kümmere sich nicht um die Reihenfolge, in der ich alles auf der Reihe bearbeiten, aber es ist sehr wichtig, dass I nicht versuchen, etwas mehr, um es zu tun, nachdem ich gerettet habe es. Gibt es einen guten Weg, dies zu tun?

Beachten Sie, dass ich nicht für verifyNoMoreInteractions suchen bin: Es bestätigt nicht, dass SaveToDatabase das letzte, was genannt wird, und es nicht auch, wenn ich etwas auf die Reihe nennen, die ich überprüfen, nicht explizit. Ich möchte in der Lage sein, etwas zu sagen wie:

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

Wenn es hilft, ich bin die Umstellung auf Mockito von einem JMock Test, der das getan hat:

row.expects(once()).method("saveToDatabase").id("save");
row.expects(never()).method(ANYTHING).after("save");
War es hilfreich?

Lösung

Ich denke, es ist mehr Maßarbeit erfordert.

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

und dann

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("...");
    }
}

Zurück Antwort:

Sie haben Recht. verifyNoMoreInteractions ist das, was Sie brauchen.

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

Andere Tipps

Nicht 100% auf Thema, aber ich war gerade das Gegenteil von dem überprüfen zu finden suchen, und dies war das einzige relevante Ergebnis, es endet Ich war nach Mockito.verifyZeroInteractions (Mock);

Just incase jemand anderes endet hier oben für diese Suche ...

Diese Frage führte mich einige Verbesserungen an der Verifizierungen API in JMockit zu machen (erhältlich in der kommenden Version 0.983).

Die Lösung kam ich mit ermöglicht es Ihnen, (in einem Testverfahren) zu schreiben:


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

... wenn Sie nur wollen, um zu überprüfen, dass eine bestimmte Methode nach allem anderem genannt wird. Um zu überprüfen, es geschieht vor alle anderen Anrufungen, den Anruf einfach bewegen nach oben. Dies gilt eigentlich zu jeder Folge von aufeinanderfolgenden Anrufungen.

Wenn zusätzlich zu der obigen Prüfung, wollen Sie auch zu prüfen, ob einige andere Methoden in beliebiger Reihenfolge aufgerufen werden, ein zweiten Prüfungen Block zum Test hinzugefügt werden kann (vor oder nach dem anderen Block es spielt keine Rolle):


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

Obwohl ein bisschen zu lang wegen der Verwendung von anonymen inneren Klassen ist diese Syntax einfach und flexibel; feststellen, wie es Struktur zum Test hinzufügt und vermeidet die Wiederholung von Methodenaufrufen (wie verify(...)). Es ist mehr, als ich hier beschrieben (hamcrest Matcher, Aufruf zählt, etc.), und es ist nicht auf die Überprüfung der Instanzmethoden begrenzt (statische Methoden und Konstrukteuren verspottet und in gleicher Weise überprüft werden können).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top