Wie kann der Mock zur Laufzeit funktionieren?
Hinter diesen Zeile Code steckt mehr als man denkt:
- Dice dice: deklariert eine Variable vom Typ Dice.
- mock(Dice.class): erstellt einen Ersatz für eine echte Dice-Instanz.
Bei Dice dice = mock(Dice.class) übergibt Dice.class Mockito ein Class<Dice>-Objekt mit Informationen über den Typ.
Mockito erzeugt daraus zur Laufzeit mithilfe von Byte Buddy einen Mock, der als Dice verwendbar ist.
Dessen Methodenaufrufe werden von Mockito abgefangen: Es protokolliert sie und liefert entweder einen zuvor festgelegten Rückgabewert oder einen Standardwert.
Reflection dient dabei dazu, den Typ und seine Methoden zur Laufzeit zu untersuchen.
Das Abfangen der Aufrufe beruht auf der von Byte Buddy erzeugten beziehungsweise instrumentierten Implementierung.
- Dice.class ist ein Ausdruck, der das Klassenobjekt für den Typ Dice liefert.
- _Class
ist der Typ dieses Klassenobjekts: Es beschreibt Dice zur Laufzeit. - Byte Buddy ist eine Bibliothek, mit der Mockito Java-Klassen zur Laufzeit erzeugt oder verändert.
- Reflection ist die Java-API, mit der ein Programm zur Laufzeit Informationen über Klassen und Methoden abfragen kann.
- Instrumentierte Implementierung bedeutet hier, dass Bytecode so ergänzt oder verändert wird, dass Mockito Methodenaufrufe abfangen und steuern kann.
Mockito erzeugt bei mock(Dice.class) einen Mock, dessen Methodenaufrufe es abfangen kann.
Bei when(dice.roll()) wird roll() tatsächlich auf dem Mock aufgerufen: Mockito merkt sich diesen Aufruf als Grundlage für eine Regel.
Mit .thenReturn(3).thenReturn(4) speichert es die Rückgabewerte für aufeinanderfolgende Aufrufe.
Später zählt Mockito die passenden roll()-Aufrufe und liefert zuerst 3, dann 4 und danach weiterhin 4.
- Mocking: mock(Dice.class) erzeugt das Testobjekt.
- Methodeninterzeption: Mockito fängt den Aufruf von roll() am Mock ab.
- Stubbing mit aufeinanderfolgenden Antworten (consecutive stubbing): thenReturn(3).thenReturn(4) legt die Antwortfolge fest. Die gespeicherte Zuordnung von roll() zu diesen Rückgabewerten nennt man auch ein Stub.