Skip to main content

Wozu Mocks

Beim Schreiben von Tests gibt es Vorgänge, die Sie nicht tatsächlich ausführen möchten – etwa den Versand von E-Mails, das Lesen und Schreiben von Caches oder Aufrufe an externe APIs. Solche Vorgänge durch eine „Fälschung, die sich wie das Original verhält“ zu ersetzen, nennt man Mocking. Die Vorteile von Mocks:
  • Schnelle Tests – Es werden keine externen Dienste oder aufwendigen Operationen ausgeführt, daher laufen die Tests schnell ab.
  • Stabile Tests – Die Tests hängen nicht vom Zustand externer Dienste ab und liefern stets dasselbe Ergebnis.
  • Klarer Testfokus – Es lässt sich gezielt eine einzelne Klasse oder Methode prüfen.
Laravel bietet direkt einsetzbare Helfer für das Mocken von Events, Jobs, Fassaden usw. Intern verwendet es Mockery, sodass Sie ohne komplexes Setup loslegen können.

Mock-Objekte

Um ein Objekt zu mocken, das über den Service-Container injiziert wird, binden Sie die Mock-Instanz in den Container ein. Der Container verwendet dann statt einer neu erzeugten Instanz Ihre Mock-Instanz.

Die Methode mock()

Mit der Methode mock(), die die TestCase-Basisklasse von Laravel bereitstellt, schreiben Sie dasselbe kürzer.

Die Methode partialMock()

Wenn Sie nur einen Teil der Methoden eines Objekts mocken möchten, verwenden Sie partialMock(). Nicht gemockte Methoden werden wie üblich ausgeführt.

Die Methode spy()

Ein Spy ist einem Mock ähnlich, unterscheidet sich aber darin, dass die Interaktion nach der Codeausführung überprüft wird. Während ein Mock vorab festlegt „diese Methode wird aufgerufen werden“, prüft ein Spy im Nachhinein „wurde diese Methode aufgerufen“.

Fassaden mocken

Fassaden unterscheiden sich von gewöhnlichen statischen Methodenaufrufen dadurch, dass sie sich mocken lassen. Sie bieten die Testbarkeit von Dependency Injection bei gleichzeitig knapper Syntax. Als Beispiel ein Controller, der den Cache verwendet:
Um die Methode get der Cache-Fassade zu mocken, verwenden Sie expects().
Mocken Sie nicht die Request-Fassade. Übergeben Sie stattdessen Eingabewerte an HTTP-Testmethoden wie get oder post. Rufen Sie ebenso statt die Config-Fassade zu mocken in Ihrem Test Config::set() auf.

Fassaden als Spy

Um eine Fassade als Spy zu beobachten, rufen Sie die Methode spy() der entsprechenden Fassade auf. Ein Spy ist praktisch, wenn Sie Interaktionen nach der Codeausführung überprüfen möchten.

Zeit manipulieren

Um zeitabhängige Logik in Tests zu prüfen, ist es praktisch, den Zeitpunkt zu ändern, den now() oder Carbon::now() zurückgeben. Die Basisklasse für Feature-Tests von Laravel bietet dafür Helfer.

travel() – Zeit verschieben

Zeitmanipulation mit Closure

Wenn Sie den Reise-Methoden eine Closure übergeben, wird die Zeit für den angegebenen Zeitpunkt angehalten, die Closure ausgeführt und danach wieder zur ursprünglichen Zeit zurückgesprungen.

freezeTime() – Zeit einfrieren

freezeTime() friert die aktuelle Zeit ein. freezeSecond() fixiert die Zeit am Anfang der aktuellen Sekunde.

Praxisbeispiel: Sperren inaktiver Threads

Zeitmanipulation ist beispielsweise hilfreich, um Funktionen wie das Sperren von Beiträgen in einem Forum nach längerer Inaktivität zu testen.
Zeitmanipulationsmethoden wie travel() sind nur in Feature-Tests verfügbar (Klassen, die von Tests\TestCase erben). In der Basisklasse TestCase von PHPUnit können sie nicht verwendet werden.

Methodenübersicht

Mocks

Zeitmanipulation

Zuletzt geändert am 13. Juli 2026