Was sind Mocks bzw. Mock-Objekte
Definition: Ein Mock ist ein Platzhalter-Objekt, das bei bestimmten Methodenaufrufen mit definierten Übergabeparametern eine ebenfalls determinierte Rückgabe (sog. Expectation) liefert.
Mock-Objekte sind also letztlich Attrappen (aus dem Englischen – to mock, etwas vortäuschen). In der Softwareentwicklung werden im Bereich der Modultests (Unit-Tests) Mocks eingesetzt, um als Platzhalter für echte Objekte zu fungieren, die von der zu testenden Klasse (Object under Test) genutzt werden.
Bei Unit-Tests geht es darum, die Methoden einer Klasse isoliert zu testen. In der Realität leben unsere Java-Klassen aber eben nicht in Isolation und benutzen Methoden und Services von anderen (Collaborator-) Klassen.
Das führt zu zweierlei Problemen:
- Externe Services können in der Regel nicht problemlos aus der normalen IDE aufgerufen werden, wenn diese Zugriff auf externe Systeme/Datenbanken benötigen.
- Die Unit-Tests sollten die Implementierung einer spezifischen Klasse isoliert testen. Werden Aufrufe anderer Klassen erlaubt die wiederum selbst Fehlerbehaftet sein können, würde das die Ergebnisse der Tests beeinflussen, was nicht gewünscht ist.
Mock-Objekte ermöglichen es uns also die Collaborator-Klassen einer zu testenden Klasse hinter den Mocks zu verstecken
Damit werden isolierte Tests, unabhängig von den Abhängigkeiten zu den anderen Programmteilen, durch Mocking ermöglicht, da die „gemockten“ Objekte das Verhalten der umgebenden Objekte simulieren und prüfen, wie diese vom Object under Test aufgerufen werden.
Abgrenzung zu verwandten Begriffen – Dummies, Fakes, Stubs und Spies
In Anlehnung an die Terminologie, die von Gerard Meszaros in seinem Standardwerk eingeführt wurde, unterscheiden wir folgende Begriffe. (Mezaros, 2007)
- Dummy Objects – Dummy Objects werden in der Regel nur genutzt und herumgereicht um Parameterlisten zu füllen, werden jedoch nie wirklich genutzt.
- Fake Objects – Fake Objects haben in der Regel funktionierende, jedoch unvollständige, Implementierungen.
- Stubs – Stubs geben festgelegte Antworten auf Aufrufe der Testklassen. Sie reagieren jedoch in der Regel nicht auf andere Aufrufe.
- Spies – Spies sind im Grunde Stubs, die jedoch zusätzlich Informationen darüber sammeln, wie sie aufgerufen wurden.
„Behaviour Verification“ vs. „State Verification“
Mock Objekte nutzen „Behaviour Verification“. Praktisch bedeutet das, es wird kein Assert gegen das Mock Collaborator-Objekt gemacht, es werden nur gegen das Object under Test Asserts gefahren. Das Mock Objekt prüft lediglich, ob das Object under Test die richtigen Calls/Aufrufe gegen das Collaborator Object (Mock) richtet.
Im Falle der Prüfung des Object under Test handelt es sich um eine „State Verifikation“, bei der durch Asserts die Zustandsänderung geprüft wird.
Verwandte Themen:
Literatur und Quellenverzeichnis:
Mezaros, G. (2007), xUnit Test Patterns: Refactoring Test Code (1.Auflage), Addison Wesley Signature Series)