Was ist ein mock-und Wann sollte man es verwenden?
Gerade lese ich den Wikipedia-Artikel über mock-Objekte, aber ich bin mir noch nicht ganz klar über Ihren Zweck. Es scheint, Sie sind Objekte, die erstellt werden, indem ein test-framework, wenn das eigentliche Objekt wäre zu kompliziert oder unberechenbar (Sie weiß zu 100% sicher was die Werte der mock-Objekt sind, weil Sie vollständig kontrollieren).
Allerdings hatte ich den Eindruck, dass alle Tests mit den Objekten der bekannten Werte, so dass ich muss etwas fehlen. Zum Beispiel in einem Kurs das Projekt wurden wir beauftragt, mit einer Kalender-Anwendung. Unsere test-suite Bestand aus event-Objekten, die wir genau wussten, was Sie waren, so konnten wir testen die Interaktionen zwischen mehreren Ereignis-Objekte verschiedener Subsysteme und der Benutzeroberfläche. Ich vermute, diese sind mock-Objekte, aber ich weiß nicht, warum Sie nicht dies tun, weil ohne die Objekte von bekannten Werten, kann man nicht testen einer system.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein mock-Objekt ist nicht nur ein Objekt mit bekannten Werten. Es ist ein Objekt, das die gleiche Schnittstelle wie ein Komplexes Objekt, das Sie nicht verwenden können test (wie Datenbank-Anbindung und result sets), aber mit einer Umsetzung, die Sie kontrollieren können, in Ihrem test.
Gibt es mocking-frameworks, mit denen Sie zum erstellen dieser Objekte on-the-fly und im wesentlichen ermöglichen es Ihnen, etwas zu sagen wie: Machen Sie mir ein Objekt mit einer Methode foo, die einen int und einen bool zurückgibt. Wenn ich übergeben Sie 0, es sollte true zurückgeben. Dann können Sie testen, den code, der verwendet foo(), um sicherzustellen, dass er reagiert entsprechend.
Martin Fowler hat einen tollen Artikel auf Spott:
Denke, der klassische Fall von client-und server-software. Zum testen der client, müssen Sie den server, den server zu testen, müssen Sie den client. Das macht unit-Test ziemlich unmöglich - ohne Verwendung von mocks. Wenn Sie verhöhnen die server, die Sie testen können die Kunden in isolation und Umgekehrt.
Den Punkt der mock ist nicht zu duplizieren das Verhalten der Dinge, die seine Verspottung obwohl. Es ist mehr als ein einfacher Zustandsautomat, dessen Zustand ändert, analysiert werden können durch das test-framework. So ein client-mock könnten erzeugen der Testdaten an den server senden und analysieren die Antwort. Sie erwarten eine bestimmte Antwort auf eine bestimmte Anfrage, und so können Sie testen, ob Sie es bekommen.
Ich Stimme mit allem, was @Lou Franco sagt und Sie sollten auf jeden Fall Lesen Sie die ausgezeichneten Martin Fowler Artikel auf test-Doppelzimmer, @Lou Franco zeigt Sie an.
Das Hauptziel einer jeden test-double (fake, stub oder mock) zu isolieren, die das Objekt unter test, so dass Sie Ihre unit-test nur prüft, dieses Objekt (nicht dessen Abhängigkeiten und die anderen Typen es arbeitet und interagiert mit).
Ein Objekt, das die Schnittstelle, die Ihr Objekt abhängig ist, kann verwendet werden, anstelle der tatsächlichen Abhängigkeit, so dass Erwartungen, die platziert werden können, dass bestimmte Wechselwirkungen auftreten. Dies kann nützlich sein, aber es gibt einige kontroversen um Staatliche vs. interaction-based testing. Übermäßiger Einsatz von mock-Erwartung führen zu brüchigen tests.
Einen weiteren Grund für die test-doubles zu entfernen, Abhängigkeiten von Datenbanken oder file-Systeme oder andere Typen, die sind teuer in der Einrichtung oder zeitraubende Vorgänge. Das bedeutet, Sie können halten Sie die Zeit benötigt, um den unit-test das Objekt, das Sie interessiert sind, auf ein minimum.
Hier ist ein Beispiel: wenn Sie code schreiben, füllt eine Datenbank, die Sie möchten vielleicht prüfen, ob eine bestimmte Methode Hinzugefügt hat, Daten an die Datenbank.
Einrichten einer Kopie der Datenbank zum testen hat das problem, dass, wenn Sie davon ausgehen, es sind keine Datensätze vor dem Aufruf der Methode getestet-und einen Rekord nach, dann brauchen Sie, um ein Rollback der Datenbank auf einen früheren Zustand, so addieren sich zu den Kosten für die Durchführung des Tests.
Wenn Sie annehmen, dass es nur noch einen Datensatz als vorher, kann es Zusammenprall mit einem zweiten tester (oder auch ein zweiter test in den gleichen code) und verbinden Sie auf die gleiche Datenbank, so dass Abhängigkeiten und macht die tests zerbrechlich.
Mock-ermöglicht es Ihnen, um die tests unabhängig voneinander und einfach einzurichten.
Dies ist nur ein Beispiel - ich bin sicher, andere können mehr.
Stimme ich zu 100% mit den anderen Beiträgen zu diesem Thema, insbesondere mit der Empfehlung für die Martin Fowler Artikel.
Vielleicht haben Sie Interesse, in unserem Buch finden Sie http://www.growing-object-oriented-software.com/. Es ist in Java, aber die Ideen sind immer noch gültig.