2009-02-17 6 views
6

Ich verbinde mich mit einem einfachen, wenn idiosynkratischen, externen Dienst.Wie können spöttische externe Dienste Unit-Tests verbessern?

Ich glaube, dass meine Komponententests nicht von der Verfügbarkeit oder Implementierung dieses externen Dienstes abhängen sollten, also beabsichtige ich, es auszuplauseln.

Ich brauche das Mock, um realistische Nachrichten und Antworten zu akzeptieren und zurückzugeben - sonst werden meine Tests keine echten Sachverhalte darstellen. Zum Beispiel muss es die richtige Art von Fehlern werfen - und es gibt mindestens 7 verschiedene Möglichkeiten, wie es scheitern kann (zwischen Ihnen und mir ist es kein sehr gut entworfener externer Dienst). Daher muss ich bei einem Minimum ein Hash von Nachrichten/Antwort-Paaren haben.

Anstatt die Kontingenz zu reduzieren, hat Spott es stattdessen woanders wieder eingeführt. In der Tat, wie das Sprichwort sagt, habe ich jetzt zwei Probleme: Ich muss sicher sein, dass das, was in meinem Hash ist, eine faire Darstellung dessen ist, wie sich der externe Dienst verhält. Aber sicherlich ist die kanonische Quelle dessen, was das Antwortobjekt X der Nachricht m gibt, X selbst. Alles andere ist riskant und chaotisch.

Habe ich falsch abgebogen? Wie kann ich diese scheinbare Zirkularität beseitigen?

BEARBEITEN Ich habe geklärt, was ich denke, das Problem ist angesichts der hilfreichen Kommentare der Justiz.

Antwort

3

Ich verweise Sie auf my two answers at another question über Unit-Tests, nur um mich nicht zu wiederholen, zuerst.

Die Sache, die ich denke, dass Mocking gibt Ihnen in dieser Umgebung ist, dass es rigoros angibt, was das Verhalten dieser externen Schnittstelle sein wird Sie werden. Dies bedeutet, dass Sie einen kontrollierten Test haben (etwas sagt mir, dass sich dieser externe Dienst von Zeit zu Zeit ändert.) So können Sie Ihren Code nicht nur mit einer bekannten "guten" Abfolge von Antworten testen und debuggen, sondern Sie haben eine dokumentierte Menge von Beispielen dessen, was Sie erwarten.

Wenn ich in dieser Situation wäre, und je nach dem realen Dienst, würde ich versucht sein, einen Komponententest oder Mock für den externen Dienst zu schreiben. Auf diese Weise können Sie, wenn Sie einen Fehler im realen Betrieb beobachten, (1) den Test mit dem Code für die externe Schnittstelle gegen Ihren Code ausführen und (2) den externen Service entsprechend Ihren Erwartungen testen.

Der Punkt ist, etwas zu haben, für das Sie echtes Vertrauen haben und das Sie vollständig kontrollieren.

+0

Ah ja, das war's, danke.Risiko und Wartung gehen nicht weg, einfach aufgrund der Tatsache, dass es ein _externer_ Service ist! Aber indem ich meine Erwartungen an sein Verhalten ausrücke, isoliere ich die Unsicherheit. –

+1

Der Link zu 'meine zwei Antworten auf eine andere Frage' ist gebrochen. Kann jemand finden, wo es jetzt lebt? –

+0

Dies sollte funktionieren. http://stackoverflow.com/questions/513778/what-do-you-think-of-junit-style-unit-testing-do-you-favor-behaviour-drive-tes/513807#513807 –

0

Ihr für Einheitentests vorgesehener Schein sollte nicht genau den externen Dienst darstellen. Sie sollten vordefinierte Sätze von Eingabe- und Ausgabewerten für den mokierten externen Dienst auswählen. Sie können oder können nicht sein, was der externe Dienst tatsächlich zurückgeben würde (aber sie sollten "irgendwie" real sein). Das Ziel Ihrer Komponententests besteht darin, zu überprüfen, ob sich Ihre Objekte bei dieser Menge von Ein- und Ausgaben für eine bestimmte Bedeutung von "korrekt" korrekt verhalten.

+0

Danke - Ich habe das Qu im Lichte Ihrer klärenden Kommentare bearbeitet. Ich bin mir nicht sicher, ob Sie meine Bedenken beantwortet haben. Wenn Sie einen Moment haben, können Sie noch einen Blick darauf werfen? Prost. –

-1

Stellen Sie sicher, dass alles, von dem Ihre Klasse abhängt, über eine Schnittstelle verfügt (im Gegensatz zu einer konkreten Implementierung), und dann können Sie JMock verwenden. Dies vereinfacht Ihre Tests immens. Sie können beispielsweise festlegen, dass ein Methodenaufruf X erwartet wird, einen bestimmten Wert zurückgeben oder eine Ausnahme auslösen. Es ist wirklich ein Zeitvertreib.

Verwandte Themen