2010-05-04 4 views
9

Wir verwenden handgeschriebene Stubs in unseren Komponententests und ich erkunde die Notwendigkeit für ein Mock Framework wie EasyMock oder Mockito in unserem Projekt.Warum brauchen wir spöttische Frameworks wie Easymock, JMock oder Mockito?

Ich finde keinen zwingenden Grund für den Wechsel zu Mocking-Frameworks aus handschriftlichen Stubs.

Kann jemand bitte beantworten, warum man sich für Frameworks spotten würde, wenn sie bereits Unit Tests mit handgeschriebenen Mocks/Stubs machen.

Dank

+0

Siehe auch http://stackoverflow.com/questions/1717107/why-do-we-need-mocking-frameworks – Finglas

Antwort

2

begann ich die gleiche Art und Weise (Schreiben Mocks von Hand) und jetzt habe ich eingeschaltet fast vollständig EasyMock über.

Ich finde, dass die Verwendung von EasyMock ist in der Regel sowohl schneller als auch flexibler.

In der Regel das erste Mal, ich brauche einen Schein, kann ich es in ein paar Zeilen Code mit EasyMock haben, während von Hand muss ich die erforderliche Schnittstelle implementieren (fairerweise kann dies von einer IDE wie generiert werden IntelliJ) und fügen Sie dann den notwendigen Code hinzu, um die benötigte Antwort zu erzeugen und/oder die Auswirkungen der Aufrufe zu erkennen.

Gut, könnte man sagen, das ist nur eine einmalige Kosten. Das nächste Mal kann ich die handgeschriebene Spottdatei einfach wiederverwenden ... Ich fand das oft nicht der Fall. In einem anderen Test könnte ich eine ähnliche Klasse mit anderem Verhalten brauchen. Z.B. verschiedene Methoden werden aufgerufen, und/oder ein anderes Ergebnis wird erwartet. Ein spezieller Fall ist, wenn erwartet wird, dass der Schein eine Ausnahme in einem Testfall auslöst, aber nicht in einem anderen. Gut, ich kann einige Parameter hinzufügen, die das Verhalten dynamisch steuern. Dann für den nächsten Test einige weitere Parameter, um mehr Verhalten zu steuern ... also habe ich eine immer kompliziertere Scheinimplementierung, die eine Abhängigkeit für immer mehr Komponententests ist - was auch die Gefahr birgt, ältere Tests versehentlich zu unterbrechen.

Im Gegensatz dazu, mit EasyMock kann ich meine Mocks für jeden Test unabhängig konfigurieren. Somit wird das Verhalten innerhalb des Unit-Test-Codes selbst kontrolliert und sichtbar, und es besteht kein Risiko von Nebenwirkungen.

Nicht zu erwähnen, dass mit EasyMock Sie überprüfen können, ob die erforderlichen Methoden in der erforderlichen Reihenfolge aufgerufen werden, wenn Sie (und ich tun das hin und wieder). Die Umsetzung von Hand (vor allem in generischer Form) wäre für den Nacken schmerzhaft, ohne zusätzlichen Nutzen.

1

Manchmal kann es einfacher sein, Mocks deklarativ zu erstellen, und es kann Ihnen dabei helfen, einige Arten von Verhalten einfacher mit dem Framework zu schreiben als mit der Hand. Ein weiterer kleiner Vorteil könnte auch sein, dass Sie mit dem Mocking-Framework explizit Spott machen.

2

Genau wie jeder andere Entwickler finde ich mich Code schreiben statt die vorhandene Lösung zu verwenden - das "nicht erfunden hier" -Syndrom.

Ihre Frage schlägt vor, dass Sie lieber die Klassen schreiben, die Sie zweimal fälschen/vortäuschen müssen, anstatt ein Framework zu verwenden, das das für Sie tun würde. Wenn Sie ein spöttisches Framework verwenden, müssen Sie Ihre handgerollten Mocks nicht mehr schreiben, umgestalten und aktualisieren, wenn Sie das gefälschte Objekt ändern.

Mit anderen Worten, die Verwendung eines Mock Framework ist wie jede andere 3rd-Party-Bibliothek, z. ORM - jemand anderes hat den Code geschrieben, damit Sie nicht müssen.

9

Vielleicht möchten Sie Martin Fowlers Mocks Aren't Stubs Artikel lesen.Der grundlegende Unterschied ist dieser:

  • a Stummel Aufgabe ist bekannt Ergebnisse auf alle Anrufe zurückzukehren
  • Ein Mock zusätzlich Anrufe in einer bestimmten Reihenfolge, mit spezifischen Parametern kommen erwartet, und wird eine Ausnahme, wenn diese Erwartungen werfen nicht erfüllt sind.

Es gibt einige Fehlerbedingungen, die nicht mit Stubs getestet werden können. Auf der anderen Seite sind Tests mit Mocks oft viel weniger stabil.

Während Stubs manuell mit vertretbarem Aufwand geschrieben werden können, würde Mocks viel mehr Arbeit erfordern. Und ein guter spöttischer Rahmen kann das Schreiben von Stubs auch schneller und einfacher machen.

+0

Kleiner Punkt, Martins Artikel wird jetzt ein bisschen alt und vermisst einige kritische Punkte. Erstens: Ich glaube nicht, dass eines der aktuellen Frameworks die Aufrufreihenfolge erzwingt, es sei denn, Sie fragen danach.Zweitens, wenn Ihre Tests instabil sind, ist dies ein nützliches Feedback, das Ihnen einen weiteren Blick auf Ihr Design geben sollte. –

13

Die einfache Antwort ist wir nicht brauchen sie.

Auch brauchen wir keine anderen bestehenden Frameworks, aber die Verwendung von Mocking-Frameworks macht unser Leben einfacher . Als Entwickler können wir mehr Zeit für das vorliegende Problem aufwenden, anstatt zu schaffen oder auszuführen, was spöttische Frameworks können.

"Ich habe keinen zwingenden Grund für die Umstellung auf Mocking Frameworks von Hand geschrieben Stubs finden."

Ich war genau das gleiche. Warum sollte ich mir die Mühe machen, einen spöttischen Rahmen zu lernen? Handschriftliche Stubs sind in Ordnung.

Ein paar Punkte kommen mir in den Sinn, vor allem die Tatsache, dass nach einer Weile Ihre Tests mit Test-Stubs obskur werden. Was Sie verwenden, wenn Sie handgeschriebene Stubs verwenden, werden als Testrahmen bezeichnet. Sie erweitern Code, um zu ermöglichen, was spöttische Frameworks tun. Mit anderen Worten, Sie schreiben Code in Stub oder geben Werte zurück, je nachdem, was passiert. Das kostet Zeit und Mühe. Ganz zu schweigen vom Platz. Ein spöttischer Rahmen kann all dies in einer Art von Linien tun.

Die Vorteile eines Mockframework sind:

  • Einfachere (subjektiv, aber nach einer Weile werden Sie nicht von Hand geschrieben Implementierungen schreiben)
  • weniger Code (Frameworks ermöglichen es Ihnen, ein Mock zu erstellen in wenigen Zeilen, anstatt volle Klassendeklarationen)
  • Folgt DRY (Sie nicht Mock-Implementierungen)
  • Wiederholung am Ende

Der größte Vorteil entsteht, wenn Sie Mock-Objekte benötigen. Den Code schreiben zu müssen, um zu überprüfen, ob eine Methode aufgerufen wurde, wie oft und so weiter, ist eine Mini-Aufgabe für sich. Wenn jemand anderes dies getan hat und ein gründlich getestetes, gut dokumentiertes Framework erstellt hat, würde es keinen Sinn machen, es nicht zu benutzen. Wie bei jedem Framework können Sie ohne es gut gehen, aber manchmal mit dem richtigen Werkzeug macht die Arbeit viel einfacher.

+1

Wie bereits erwähnt, lohnt es sich, den * "Mocks sind keine Stubs" * Artikel zu überprüfen. Spottgerüste erlauben Spott, Stubbing und Fälschen. Mit anderen Worten, sie sind sehr vielseitig. – Finglas