Skip to content
IRC-CodingIRC-Coding
Test DoublesMockStubFakeDummySpyUnit Tests

Mock, Stub, Fake und Test Doubles: Ersatzobjekte im Test

Lerne die Unterschiede zwischen Mock, Stub, Fake, Dummy und Spy. Test Doubles erleichtern isoliertes Testen und machen Tests schneller und stabiler.

S

schutzgeist

4 min read
Mock, Stub, Fake und Test Doubles: Ersatzobjekte im Test

Mock, Stub, Fake und Test Doubles

Test Doubles sind Ersatzobjekte für echte Abhängigkeiten in Tests. Sie helfen, Komponenten isoliert zu testen, externe Systeme auszuschalten und Tests deterministisch zu gestalten. Wer die Unterschiede zwischen Mock, Stub, Fake, Dummy und Spy versteht, schreibt präzisere und wartbarere Tests.

In a Nutshell

  • Test Doubles ersetzen echte Abhängigkeiten in Tests.
  • Dummy, Stub, Fake, Spy und Mock unterscheiden sich nach Verhalten und Einsatzzweck.
  • Mocks prüfen Interaktionen, Stubs liefern feste Antworten, Fakes enthalten vereinfachte Logik.
  • Zu viele Mocks können Tests brüchig machen.

Kompakte Fachbeschreibung

Der Begriff Test Double stammt aus dem Stunt-Double im Film. Genau wie ein Schauspieler von einem Double ersetzt wird, übernimmt ein Test Double die Rolle einer echten Abhängigkeit im Test. Ziel ist es, die zu testende Einheit von der Außenwelt zu isolieren, sodass nur ihr Verhalten bewertet wird.

Die fünf Test Doubles

Dummy

Ein Dummy ist ein Objekt, das nur übergeben wird, aber nie verwendet wird. Es dient lediglich der Befriedigung von Methodensignaturen.

Stub

Ein Stub liefert vordefinierte Antworten auf Aufrufe. Er ersetzt eine echte Abhängigkeit durch ein festes Ergebnis, ohne eigene Logik zu enthalten.

Fake

Ein Fake enthält eine vereinfachte, aber funktionale Implementierung. Ein In-Memory-Repository ist ein typisches Beispiel für einen Fake.

Spy

Ein Spy protokolliert Aufrufe, damit sie später überprüft werden können. Er ist eine Art handgestrickter Mock.

Mock

Ein Mock ist ein Objekt, bei dem die erwarteten Interaktionen vor dem Test definiert werden. Nach dem Test wird überprüft, ob diese Aufrufe tatsächlich stattgefunden haben.

Praxisbeispiel: Bestellverarbeitung mit Test Doubles

from unittest.mock import Mock

class OrderService:
    def __init__(self, payment_gateway, inventory_repository):
        self.payment_gateway = payment_gateway
        self.inventory_repository = inventory_repository

    def process_order(self, order):
        available = self.inventory_repository.is_available(order.product_id)
        if not available:
            return {"status": "failed", "reason": "out_of_stock"}
        payment_result = self.payment_gateway.charge(order.amount)
        if payment_result.success:
            return {"status": "success"}
        return {"status": "failed", "reason": payment_result.error}

class PaymentResult:
    def __init__(self, success, error=None):
        self.success = success
        self.error = error

def test_order_success():
    inventory = Mock()
    inventory.is_available.return_value = True

    payment = Mock()
    payment.charge.return_value = PaymentResult(success=True)

    service = OrderService(payment, inventory)
    result = service.process_order(Mock(product_id=1, amount=99.99))

    assert result["status"] == "success"
    payment.charge.assert_called_once_with(99.99)

Vorteile und Nachteile

Vorteile

  • Isolation: Externe Systeme und langsame Abhängigkeiten werden ausgeschaltet.
  • Schnelligkeit: Tests laufen ohne echte Datenbanken oder Netzwerkaufrufe.
  • Determinismus: Feste Rückgabewerte machen Tests vorhersagbar.
  • Fokus: Es wird nur das Verhalten der Einheit geprüft.

Nachteile

  • Falsche Sicherheit: Mocks können ein falsches Bild von der Realität vermitteln.
  • Wartungsaufwand: Eng gekoppelte Mocks brechen bei Refactorings.
  • Overhead: Zu viele Test Doubles verschleiern das eigentliche Verhalten.
  • Lernkurve: Die feinen Unterschiede zwischen Mock und Stub werden oft missverstanden.

Prüfungsrelevante Stichpunkte

  • Definition und Zweck von Test Doubles.
  • Unterschiede zwischen Dummy, Stub, Fake, Spy und Mock.
  • Wann wird welcher Double eingesetzt.
  • Vorteile und Risiken von Mocks.
  • Verbindung zur Testpyramide und isoliertem Testen.

Typische Prüfungsfragen (mit Kurzantwort)

  1. Was ist ein Test Double? Ein Ersatzobjekt für eine echte Abhängigkeit im Test.

  2. Was ist der Unterschied zwischen Mock und Stub? Ein Stub liefert feste Antworten, ein Mock überprüft Interaktionen.

  3. Was ist ein Fake? Ein Ersatz mit vereinfachter, aber funktionaler Logik.

  4. Wann verwendet man einen Dummy? Wenn ein Objekt nur als Parameter übergeben werden muss, aber nicht genutzt wird.

  5. Was ist ein Nachteil von Mocks? Sie können zu stark an die Implementierung koppeln und bei Refactorings brechen.

Wichtigste Quellen

  1. https://martinfowler.com/bliki/TestDouble.html
  2. https://xunitpatterns.com/Test%20Double.html
  3. https://en.wikipedia.org/wiki/Test_double

Häufig gestellte Fragen

Was ist der Hauptgrund für Test Doubles?

Test Doubles ersetzen echte Abhängigkeiten, um eine Komponente isoliert, schnell und deterministisch zu testen.

Ist ein Mock das Gleiche wie ein Stub?

Nein. Ein Stub liefert vordefinierte Antworten, während ein Mock Interaktionen definiert und später überprüft.

Was ist ein typisches Beispiel für einen Fake?

Ein In-Memory-Repository, das eine echte Datenbank ersetzt, aber trotzdem grundlegende Speicher- und Abfrageoperationen beherrscht.

Wann sollte man keinen Mock verwenden?

Vermeide Mocks, wenn das echte Zusammenspiel mit einer Abhängigkeit das entscheidende Verhalten ist, beispielsweise bei komplexen Datenbankabfragen.

Was ist ein Spy?

Ein Spy protokolliert Aufrufe, damit sie im Test überprüft werden können. Er ist eine handgestrickte Alternative zu einem Mock.

Was ist ein Dummy?

Ein Dummy ist ein Objekt, das nur als Parameter übergeben wird, aber im Test selbst keine Rolle spielt.

Können Test Doubles Fehler verbergen?

Ja, wenn sie zu stark vereinfachen oder falsche Annahmen über das echte Verhalten der Abhängigkeit treffen.

Wie viele Mocks sollte ein Test maximal enthalten?

Es gibt keine feste Regel, aber ein Test mit mehreren Mocks wird oft komplex und anfällig. Eine klare Einheit und wenige, gut begründete Doubles sind besser.

Was ist Interaction Testing?

Interaction Testing überprüft, ob eine Komponente ihre Abhängigkeiten in der erwarteten Weise aufruft. Mocks werden dafür eingesetzt.

Was ist State Testing?

State Testing überprüft das Ergebnis oder den Zustand nach einer Aktion, ohne die Interaktionen im Detail zu beobachten.

Sollte man externe APIs mocken?

In Unit Tests ja, um Isolierung und Schnelligkeit zu erreichen. Für Integrationstests sollte man echte oder zumindest realitätsnahe Schnittstellen bevorzugen.

Was ist ein Vorteil von Fakes gegenüber Mocks?

Fakes enthalten echte, wenn auch vereinfachte Logik und geben ein realistischeres Bild der Abhängigkeit als starre Mocks.

Welche Frameworks bieten Test Doubles?

Gängige Frameworks sind Mockito für Java, unittest.mock für Python, Moq für C#, NSubstitute für .NET und jest.fn() für JavaScript.

Was bedeutet Over-Mocking?

Over-Mocking bedeutet, dass ein Test zu viele Abhängigkeiten simuliert. Das macht den Test brüchig und wenig aussagekräftig.

Wie helfen Test Doubles der Testpyramide?

Sie ermöglichen eine große Menge schneller, isolierter Unit Tests und bilden damit die breite Basis der Testpyramide.

Weiter im Software Testing Lernpfad

Der nächste Artikel im Software Testing Lernpfad behandelt Test Driven Development: Red, Green, Refactor — die Grundlagen von TDD mit dem Red-Green-Refactor Zyklus.

Zurück zum DEV Blog
Share:

Ähnliche Beiträge