Mockery PHP: Vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Mockery für PHP: Vollständige Anleitung mit Beispielen

1. Was ist Mockery und warum braucht man es?

Mockery ist eine leistungsstarke und flexible Bibliothek zum Erstellen von Mock-Objekten in PHP. Sie wird im Unit-Testing eingesetzt und ermöglicht es Entwicklern, den zu testenden Code von seinen Abhängigkeiten zu isolieren. Anstatt reale Objekte (wie Datenbankverbindungen, API-Clients oder das Dateisystem) zu verwenden, erstellt man "Attrappen" (Mocks), die das Verhalten der Originale nachahmen. Das macht Tests schnell, zuverlässig und unabhängig von externen Faktoren.

Warum ist das notwendig? Stellen Sie sich vor, Sie testen eine Klasse OrderProcessor, die nach einer Bestellung eine E-Mail versendet. Wenn Sie einen echten Mailer verwenden, wird Ihr Test langsam, abhängig von der Verfügbarkeit des SMTP-Servers und könnte versehentlich E-Mails an echte Benutzer senden. Mit Mockery erstellen Sie einen "gefälschten" Mailer, der lediglich prüft, ob die Methode send() mit den richtigen Argumenten aufgerufen wurde. So konzentrieren Sie sich auf die Logik von OrderProcessor, nicht auf die Infrastruktur.

Mockery ist mehr als nur ein Objekt-Ersatz. Sie bietet eine umfangreiche API zur Beschreibung von Erwartungen (Expectations): Sie können festlegen, wie oft eine Methode aufgerufen werden soll, mit welchen Argumenten, in welcher Reihenfolge und was sie zurückgeben soll. Das macht Tests nicht nur isoliert, sondern auch selbstdokumentierend, da die Erwartungen die Interaktion zwischen Objekten klar beschreiben.

2. Installation

Mockery wird über Composer installiert, den Standard-Paketmanager für PHP. Es wird empfohlen, sie als Entwicklungsabhängigkeit (require-dev) zu installieren, da sie in der Produktionsumgebung nicht benötigt wird.

composer require --dev mockery/mockery

Stellen Sie nach der Installation sicher, dass Ihre composer.json den folgenden Eintrag im Abschnitt require-dev enthält:

{
    "require-dev": {
        "mockery/mockery": "^1.6"
    }
}

Wenn Sie PHPUnit verwenden, lässt sich Mockery "out of the box" über das Trait \Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration integrieren.

3. Schnellstart

Lassen Sie uns einen einfachen Test erstellen, der die grundlegende Funktionalität von Mockery demonstriert. Angenommen, wir haben eine Klasse Calculator, die von einem Logger-Service abhängt.

<?php
// Beispielklassen
interface Logger {
    public function log(string $message): void;
}

class Calculator {
    private Logger $logger;

    public function __construct(Logger $logger) {
        $this->logger = $logger;
    }

    public function add(int $a, int $b): int {
        $result = $a + $b;
        $this->logger->log("Adding $a and $b, result: $result");
        return $result;
    }
}

// Test mit Mockery
use PHPUnit\Framework\TestCase;
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;

class CalculatorTest extends TestCase {
    use MockeryPHPUnitIntegration;

    public function testAddLogsCorrectly(): void {
        // 1. Mock für Logger erstellen
        $loggerMock = Mockery::mock(Logger::class);

        // 2. Erwartung definieren: Methode log() soll 1 Mal aufgerufen werden
        //    mit einer bestimmten Nachricht
        $loggerMock->shouldReceive('log')
            ->once()
            ->with('Adding 2 and 3, result: 5');

        // 3. Testobjekt mit dem Mock erstellen
        $calculator = new Calculator($loggerMock);

        // 4.                    

Empfehlungen