2016-11-14 2 views
1

Ich bin schwer zu wissen, wie zu entscheiden, mit welchen Objekten mein Testobjekt interagiert, sollte verspottet werden.Sollte ich alle Objekte verspotten, mit denen mein Testobjekt interagiert?

Ich kann sehen, dass die letzten 3 verspottet werden, weil sie mit einigen externen Systemen umgehen. Was ist mit Kunde und Rechnung? Wenn nicht, warum?

+0

Eine Teststrategie besteht darin, zuerst Objekte/Ebenen niedrigerer Ebene zu testen und dann diese getesteten Objekte zu verwenden, um Ebenen höherer Ebenen zu testen. Wenn Ihnen das (aufgrund Ihres Designs und Ihrer Anforderungen) besser erscheint, könnte es die beste Strategie für Sie sein. Sie müssen nicht alles verspotten. – markspace

+0

Über dieses Thema besteht kein vollständiger Konsens. Und das ist gelinde gesagt, es gibt bittere Auseinandersetzungen darüber.Unabhängig davon, welchen Weg Sie am Ende wählen, denken Sie immer daran, was der Zweck des automatisierten Tests ist: Fehler mit möglichst geringem Aufwand in kürzester Zeit zu finden. Oder um es umzudrehen: um Vertrauen in die Korrektheit Ihres Codes aufzubauen. Das ist alles was zählt. – biziclop

Antwort

4

Die allgemeine Antwort auf die Frage "Sollte ich alle Objekte verspotten, mit denen mein Testobjekt interagiert?" ist eine klare keine: das ist keine Regel, die Sie internalisieren oder folgen sollten. Mocks sind eine von vielen Arten von Testdoppelungen, und Sie müssen beurteilen, wo Sie Mocks verwenden, wo Sie andere Fälschungen verwenden oder Doubles testen und wo Sie echte Kollaborateure einsetzen können. Ich stimme Ihrer Entscheidung zu, dass die letzten drei Felder (Dienste) wahrscheinlich spöttisch sind, und wenn es nach mir ginge, würde ich reale Objekte für die beiden vorherigen Felder (Kunde und Rechnung) verwenden.

Hier habe ich zu einer Richtlinie haften würde, nicht Mock Datenobjekte, die von wenigen Beobachtungen folgt:

  • Datenobjekte sind oft extrem Stateful und spöttischen Rahmenbedingungen neigen Zustand Stummel schlecht. Mockito hat nicht wirklich eine großartige Syntax für "getX gibt 15 unbegrenzt, bis Sie setX(20) aufrufen, dann getX gibt 20" zurück. Daher ist Stubbing oft schwer.

  • Für Datenobjekte, die nur Felder/Getter/Setter sind, ist es nicht viel Wert zu verifizieren, dass dies nicht durch Lesen von veränderlichen Zuständen aus einer realen Implementierung erfolgen kann. Wen interessiert es, ob getY aufgerufen wurde, solange der Wert im Objekt gelesen wurde? Wen kümmert es, wie oft setY aufgerufen wurde, solange der richtige Wert im Objekt endet? Daher ist eine Überprüfung oft nicht notwendig.

  • Datenobjekte werden in der Regel vor den Objekten geschrieben, die sie verwenden, daher gibt es oft eine funktionierende Implementierung, die bereits existiert.

  • Datenobjekte weisen oft ein deterministisches Verhalten mit wenigen externen Wechselwirkungen auf, so dass oft nur wenig zur Verbesserung der Teststabilität oder zur Verringerung der Testschuppigkeit zu erhalten ist.

Wie biziclop in der Frage Kommentaren erwähnt,

immer daran denken, was der Zweck des automatisierten Testens ist: Fehler in kürzester Zeit mit möglichst geringen Aufwand zu finden. Oder um es umzudrehen: um Vertrauen in die Korrektheit Ihres Codes aufzubauen.

In diesem Sinne Datenobjekte spöttischen hat einen hohen Preis an die Lesbarkeit und Korrektheit Ihres Tests, und ist auch unwahrscheinlich, Nutzen in Bezug auf Test Korrektheit oder Stabilität. Ich würde es vermeiden.

Verwandte Themen