26. Oktober 2015 | 2 min lesezeit

Test Doubles

Im Kontext testgetriebener Entwicklung erschweren komplexe Abhängigkeiten zwischen Klassen häufig die Erstellung von Unit Tests. Der Fokus auf die zu testende Klasse (System Under Test, kurz SUT) geht durch einen komplizierten Initialisierungsprozess und der Menge an weiteren Abhängigkeiten schnell verloren. Dabei kann dieses Szenario mit Test Doubles addressiert werden.

Test Doubles stellen Stellvertreterobjekte dar, die aufgrund ihrer Klassensignatur Abhängigkeiten eines SUT ersetzen. Dadurch ergibt sich eine Entkopplung bzw. Isolierung des SUT gegenüber seinen Abhängigkeiten. Diese ist sinnvoll, wenn

  • eine „unzuverlässige“ 3rd-Party Komponente (oder System) angebunden werden sollen.
  • die Initialisierung aufgrund vieler weiterer Abhängigkeiten nicht trivial ist.
  • der Initialisierungsprozess und/oder die Verwendung teuer ist.
  • Operationen nicht idempotent sind (z.B. Random Number Generator).

Im Wesentlichen können zwei Arten von Test Doubles unterschieden werden. Auf der einen Seite gibt es Dummies, Stubs, Spies und Fakes, mit deren Hilfe der State im SUT verifiziert werden kann. Die vier genannten unterscheiden sich nur marginal.

Viel interessanter ist hingegen die andere Seite – die der Mocks. Ein Mock kann für einen Test konfiguriert werden, d.h. man kann sein konkretes Verhalten definieren und anschließend verifizieren. So können beispielsweise sehr einfach komplexe Fehlersituationen simuliert werden. Für das SUT bedeutet dies, dass sein internes Verhalten mit Hilfe des Mocks gesteuert und geprüft werden kann. Obwohl dieses Vorgehen nicht konform mit den Prinzipien der Objektorientierung (Tell don’t ask Principle) ist, bietet es den großen Vorteil interne Abläufe gezielt kontrollieren zu können.

Der Aufbau eines Unit Tests mit Test Doubles ist typischerweise in vier Schritte gegliedert:

  1. Initialisierung
  2. Definition des Verhaltens bei Einsatz von Mocks
  3. Ausführung der zu testenden Methode
  4. Verifikation des Ergebnisses und des Verhaltens.

Um Mocks im Rahmen von Unit-Tests zu Erzeugen, werden für gewöhnlich Frameworks wie Mockito oder EasyMock eingesetzt. Das nachfolgende Beispiel demonstriert das typische Vorgehen unter Verwendung von Mockito.

Auf dem ersten Blick sieht man, wie einfach und selbsterklärend Tests formuliert werden können. Während mit der Methode findCustomer der Schönwetterflug geprüft wird, simuliert die Methode findCustomerWithoutResult das Verhalten der Service Methode im Fehlerfall.

Zusammenfassend kann man festhalten, dass Test Doubles und insbesondere Mocks die Testbarkeit von Klassen aufgrund ihrer Vielfältigkeit auf eine qualitativ höhere Ebene heben können. Zusätzlich regt die Art der Strukturierung der Tests auch in vielen Fällen dazu an, die Struktur der Anwendung zu überdenken.


Keine Kommentare

Kontakt

OPEN KNOWLEDGE GmbH

Standort Oldenburg:
Poststraße 1, 26122 Oldenburg

Standort Essen:
II. Hagen 7, 45127 Essen