Wie in der Antwort mit den meisten Stimmen erwähnt, erörtert Martin Fowler diese Unterscheidungen in Mocks Aren't Stubs und insbesondere in der Unterüberschrift Der Unterschied zwischen Mocks und Stubs. Lesen Sie daher unbedingt diesen Artikel.
Anstatt sich darauf zu konzentrieren, wie sich diese Dinge unterscheiden, finde ich es aufschlussreicher, sich darauf zu konzentrieren, warum dies unterschiedliche Konzepte sind. Jedes existiert für einen anderen Zweck.
Fälschungen
Eine Fälschung ist eine Implementierung, die sich "natürlich" verhält, aber nicht "echt" ist. Dies sind unscharfe Konzepte, und so haben verschiedene Menschen unterschiedliche Vorstellungen davon, was Dinge zu einer Fälschung macht.
Ein Beispiel für eine Fälschung ist eine speicherinterne Datenbank (z. B. die Verwendung von SQLite mit dem :memory:
Speicher). Sie würden dies niemals für die Produktion verwenden (da die Daten nicht beibehalten werden), aber es ist als Datenbank für die Verwendung in einer Testumgebung vollkommen ausreichend. Es ist auch viel leichter als eine "echte" Datenbank.
Als weiteres Beispiel verwenden Sie möglicherweise eine Art Objektspeicher (z. B. Amazon S3) in der Produktion, aber in einem Test können Sie Objekte einfach in Dateien auf der Festplatte speichern. dann wäre Ihre Implementierung "Auf Festplatte speichern" eine Fälschung. (Oder Sie können sogar den Vorgang "Auf Festplatte speichern" vortäuschen, indem Sie stattdessen ein In-Memory-Dateisystem verwenden.)
Stellen Sie sich als drittes Beispiel ein Objekt vor, das eine Cache-API bereitstellt. Ein Objekt, das die richtige Schnittstelle implementiert, aber einfach überhaupt kein Caching durchführt, sondern immer einen Cache-Fehler zurückgibt, wäre eine Art Fälschung.
Der Zweck einer Fälschung besteht nicht darin, das Verhalten des zu testenden Systems zu beeinflussen , sondern die Implementierung des Tests zu vereinfachen (indem unnötige oder schwergewichtige Abhängigkeiten beseitigt werden).
Stubs
Ein Stub ist eine Implementierung, die sich "unnatürlich" verhält. Es ist vorkonfiguriert (normalerweise vom Testaufbau), um auf bestimmte Eingaben mit bestimmten Ausgaben zu reagieren.
Der Zweck eines Stubs besteht darin, Ihr zu testendes System in einen bestimmten Zustand zu versetzen. Zum Beispiel, wenn Sie einen Test für einige Code schreiben , dass wirkt mit einer REST - API, könnten Sie Stub die REST - API mit einer API , dass immer eine Dosen-Antwort zurückgibt, oder dass reagiert auf eine API - Anforderung mit einem bestimmten Fehler. Auf diese Weise können Sie Tests schreiben, die Aussagen darüber machen, wie das System auf diese Zustände reagiert. Testen Sie beispielsweise die Antwort, die Ihre Benutzer erhalten, wenn die API einen 404-Fehler zurückgibt.
Ein Stub wird normalerweise implementiert, um nur auf die genauen Interaktionen zu reagieren, auf die Sie ihn angewiesen haben. Aber das Hauptmerkmal, das etwas zu einem Stub macht, ist sein Zweck : Bei einem Stub geht es darum, Ihren Testfall einzurichten.
Verspottet
Ein Mock ähnelt einem Stub, es wurde jedoch eine Überprüfung hinzugefügt. Der Zweck eines Mocks besteht darin, Aussagen darüber zu treffen, wie Ihr zu testendes System mit der Abhängigkeit interagiert .
Zum Beispiel, wenn Sie einen Test für ein System , dass Uploads von Dateien auf eine Website schreiben, könnten Sie einen bauen Mock , der eine Datei akzeptiert und dass Sie behaupten können , dass die hochgeladene Datei korrekt war. In kleinerem Maßstab wird häufig ein Mock eines Objekts verwendet, um zu überprüfen, ob das zu testende System bestimmte Methoden des verspotteten Objekts aufruft.
Mocks sind an Interaktionstests gebunden , bei denen es sich um eine spezifische Testmethode handelt. Menschen, die lieber den Systemstatus als die Systeminteraktionen testen möchten, werden Mocks, wenn überhaupt, sparsam einsetzen.
Test verdoppelt sich
Fälschungen, Stubs und Mocks gehören zur Kategorie der Testdoppel . Ein Testdouble ist ein Objekt oder System, das Sie in einem Test anstelle von etwas anderem verwenden. Bei den meisten automatisierten Softwaretests werden Testdoppel der einen oder anderen Art verwendet. Einige andere Arten von Test-Doubles umfassen Dummy-Werte , Spione und E / A- Blackholes .