Zum Inhalt

Dummy, Fake, Stub, Mock

Ziel:

  • Ich kann erklären, wieso und wie Platzhalter bei Unit Tests verwendet wird.
  • Ich kann die Unterschiede zwischen Dummy, Fake, Stub und Mock erklären.

Arten von Platzhaltern

Will man bei Unit Tests Platzhalter anwenden, so kann man sich verschiedene Ansätze vorstellen Martin Fowler umschreibt diese wie folgt: (https://martinfowler.com/articles/mocksArentStubs.html)

Dummy-Objekte werden übergeben, aber nie verwendet. Normalerweise werden sie nur zum Füllen von Parameterlisten verwendet.

Fake-Objekte sind tatsächlich funktionierende Implementierungen. Sie haben aber in der Regel Vereinfachungen, mit denen Sie sich im Verhalten von echten Objekten unterscheiden, was ihren Einsatz beeinträchtigen kann. (Beispiel wäre eine im Memory realisierte Datenbank.)

Stubs bieten Konserven Antworten auf Anrufe, die während des Tests verwendet werden. In der Regel reagieren diese Aufrufe allerdings überhaupt nicht, was ihren Einsatz einschränkt. Stubs können auch Informationen über Anrufe aufzeichnen, wie z. B. einen E-Mail-Gateway-Stub, sich an die gesendeten Nachrichten erinnert oder wie viele Nachrichten gesendet wurden.

Mocks sind vorprogrammierte Objekte, deren Antworten spezifisch den Erwartungen an das Verhalten des ge-mockten Objektes angepasst werden.

Wieso muss ich überhaupt einen Platzhalter anwenden?

Craps ist ein Würfelspiel, dem man in vielen amerikanischen Filmen begegnet. Man wirft zwei Würfel gegen eine Bande des Spielfelds und hofft durch die richtige Augenzahl zu gewinnen.

wuerfel

In einer einfachen Applikation wurde Craps mit zwei Klassen implementiert:

creps

Die Klasse Dice gibt bei Aufruf ihrer Methode roll einen zufälligen Wert zwischen 1 bis 6 zurück. Die Methode play der Klasse Craps ruft während dem Spiel die Methode roll mehrfach auf. Für die Methode play soll ein Unit Test geschrieben werden.

Problem: Die Zufälligkeit der Methode roll verunmöglicht es im Unit Test das Verhalten von play vorher zu sagen.

Lösung: Wir ersetzen die Klasse Dice durch einen Mock von Dice. Bei diesem Mock können wir für die einzelnen Aufrufe von roll das Ergebnis vorgeben und so das erwartete Verhalten von play definieren und im Test das implementierte Verhalten von play verifizieren.

Wie sieht ein solcher Unit Test aus?

creps

Zeile 14: Der Mock für die Klasse Dice wird erstellt.

Zeile 15: Bestimmen, dass der erste Aufruf der Methode roll eine 3, der zweite und jeder weitere Aufruf eine 4 zurückgibt.

Zeile 18: Gemäss Regeln gewinnt der Spieler, wenn im ersten Wurf die Summe 7 gewürfelt wird. Play muss dann true zurückgeben.