Testdoubles: Stubs vs. Mocks vs. Fakes vs. Spys
Dieser Beitrag ist eine Begriffserklärung zu Testdoubles – inklusive Prüfungsfragen und Tags.
In a Nutshell
- Stub: liefert vordefinierte Antworten
- Mock: prüft Interaktionen (Erwartungen)
- Fake: vereinfachte, funktionale Implementierung
- Spy: zeichnet Aufrufe mit auf (kombiniert Stub + Mock)
Kompakte Fachbeschreibung
Stub
Gibt feste Antworten zurück, ohne Verhalten zu prüfen. Gut für Zustandslose Tests.
Mock
Überprüft, ob bestimmte Methoden mit bestimmten Parametern aufgerufen werden. Nützlich, wenn Interaktionen kritisch sind.
Fake
Arbeitende, aber vereinfachte Implementierung (z.B. In‑Memory‑DB). Gut für Integration‑ähnliche Unit‑Tests.
Spy
Speichert Aufrufe und ermöglicht später Prüfungen (Hybrid aus Stub und Mock).
Prüfungsrelevante Stichpunkte
- Stub: Antworten vordefinieren, keine Verhaltensprüfung
- Mock: Erwartungen definieren und verifizieren
- Fake: Funktionale Vereinfachung (z.B. In‑Memory‑Repo)
- Spy: Aufrufe aufzeichnen, später prüfen
- Einsatzregeln: Stub für Zustand, Mock für Verhalten, Fake für Komplexität
- Frameworks: Mockito, unittest.mock, Jest
Kernkomponenten
- Stub (Antworten)
- Mock (Erwartungen)
- Fake (vereinfachte Implementierung)
- Spy (Aufzeichnung)
- Testisolation
- Framework‑Nutzung
- Setup/Teardown
- Assertions
- Verifikation
- Wartung
Praxisbeispiel (Rabattservice)
// Stub
DiscountPolicy stub = new DiscountPolicyStub(10); // immer 10%
int rabatt = service.berechneRabatt(kunde, artikel);
// Mock
DiscountPolicy mock = mock(DiscountPolicy.class);
when(mock.getRabatt(kunde)).thenReturn(10);
verify(mock).getRabatt(kunde);
// Fake
InMemoryDiscountRepository fake = new InMemoryDiscountRepository();
fake.add(new Discount(kunde, 10));
// Spy
DiscountPolicySpy spy = new DiscountPolicySpy();
service.berechneRabatt(kunde, artikel);
assertEquals(1, spy.getCallCount());
Typische Prüfungsfragen (mit Kurzantwort)
- Unterschied Stub vs. Mock? Stub liefert Antworten; Mock prüft Aufrufe.
- Wann Fake verwenden? Wenn eine funktionale Vereinfachung nötig ist (z.B. In‑Memory‑DB).
- Was macht ein Spy? Zeichnet Aufrufe auf und erlaubt später Prüfungen.
Wichtigste Quellen
- https://martinfowler.com/articles/mocksArentStubs.html
- https://junit.org/junit5/docs/current/user-guide/
- https://testing.googleblog.com