Wie verhöhnt man die vielen Abhängigkeiten, die für Integrationstests benötigt werden?Mocking für Integrationstests
Ich verwende Mockito für meine 'reinen' Unit Tests. "Rein" bedeutet in diesem Fall, dass eine einzelne Klasse getestet wird und alle Abhängigkeiten gespottet werden. Schön.
Jetzt kommen Integrationstests. Lassen Sie uns sagen, in diesem Fall ein Integrationstest so etwas wie dies testen:
- Nachricht in eine Warteschlange gestellt wird
- Nachricht ‚verarbeitet‘ wird
- Antwortnachricht auf einer Antwortwarteschlange setzen
Lassen Sie uns auch sagen, dass die Verarbeitung, die in Schritt 2 passiert, ernsthafte Zeug ist. Es stützt sich auf viele Datenbankinteraktionen, auf mehrere externe Dienste, das Dateisystem, alle möglichen Dinge. Es gibt auch viele Nebenwirkungen, die der Fluss auslösen wird, so dass ich nicht einfach sicherstellen kann, dass die Antwort richtig ist - ich muss die Nebenwirkungen überprüfen.
Jede dieser Abhängigkeiten wird von einer einzigen zustandslosen Serviceklasse umschlossen, die sie schön und ansprechend macht.
Wie gehen Leute damit um?
Ich würde gerne Mockito verwenden, so dass ich die Nebenwirkungen, die der obige Fluss haben wird, überprüfen konnte. Mocktios Dokumentation (und zu einem großen Teil ihre Implementierung) scheint jedoch stark dagegen zu kämpfen, sie in anderen Zusammenhängen als "reinen" Komponententests zu verwenden. Ich habe versucht, diesen Weg zu gehen, aber
- Es ist schwierig, die Stub-Daten zu füllen (wie es viele, es ist)
- Es ist schwer zu haben Frühling jene stubbed Instanzen in meine Bohnen injiziert
- Es ist schwierig, um die Mocks "zurückzusetzen", so dass ich eine andere Menge von Interaktionen verifizieren kann, ohne die Stubs zu löschen.
EDIT
Ich weiß, dass ich die Datenbank Problem mit so etwas wie eine HSQLDB Instanz umgehen konnte, aber es ist immer noch die Frage der externen Dienstleistungen. Für die Wiederholbarkeit kann ich mich nicht darauf verlassen, dass diese Dienste in Betrieb sind, in dem Zustand sind, den ich benötige, usw. Die einzige Option, die ich dort sehe, ist, sie zu verspotten.
Whatdaya tun?
Nur um zu klären, wie Integrationstests auf zwei Arten vorgenommen werden können. Es klingt, als ob Sie Integrationstests wie im Test meinen, dass verbindungsfähige Komponenten gut zusammenarbeiten (im Wesentlichen das Testen der APIs). Aber manchmal bezieht sich die Integration auf Ende-zu-Ende, so dass Sie Ihren Dienst nicht verspotten und tatsächlich zulassen, dass er die Datenbank trifft. Diese Klarstellung kann bei der Antwort helfen. Bitte beachten Sie http://stackoverflow.com/questions/4904096/whats-the-difference-between-unit-functional-acceptance-and-integration-test zur weiteren Erläuterung der Typen –
gilt für jeden Test (Integration oder Ende-zu-Ende), der viele externe Abhängigkeiten erfordert. Zum Beispiel könnte ich meine Datenbank-Stubs durch eine HSQLDB-Instanz ersetzen, aber ich habe immer noch alle anderen Dienste. Will die Frage ein wenig redigieren, um zu klären. –
Also, wie hast du das Spottproblem schließlich gelöst? – Pupsik