Sobes.tech
Middle

Was ist der Unterschied zwischen stop und mock?

sobes.tech KI

Antwort von AI

stop — ist eine Technik zur Isolierung des Tests von direkten Abhängigkeiten (z.B. Aufrufe an externe APIs, Datenbanken) durch den Austausch realer Objekte gegen Test-Doubles. Es wird verwendet, um das Verhalten externer Abhängigkeiten zu kontrollieren und die Reproduzierbarkeit der Tests sicherzustellen.

mock (abgeleitet von "Mock-Objekt") — ist eine Art Test-Dummy, der nicht nur das echte Objekt ersetzt, sondern auch überprüfbar macht, wie der getestete Code mit ihm interagiert. Mit Mocks kann man (assert) über Methodenaufrufe, Argumente und Anzahl der Aufrufe Aussagen treffen.

Daher ist stop ein allgemeiner Begriff, der die Isolation beschreibt, während mock ein konkretes Werkzeug zu ihrer Umsetzung ist, das die Überprüfung der Interaktion ermöglicht.

Beispiel mit PHPUnit und Mockery:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// Klasse, die eine externe Abhängigkeit nutzt
class UserProcessor
{
    private $apiClient;

    public function __construct(ApiClient $apiClient)
    {
        $this->apiClient = $apiClient;
    }

    public function processUserData(int $userId): bool
    {
        $data = $this->apiClient->fetchUserData($userId);

        if ($data && $data['status'] === 'active') {
            // Logik zur Verarbeitung eines aktiven Nutzers
            return true;
        }
        return false;
    }
}

// Beispiel für die Verwendung eines Mocks im Test
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // Mock für ApiClient erstellen
        $apiClientMock = Mockery::mock(ApiClient::class);

        // Erwartetes Verhalten für den Mock festlegen
        // Erwartung: fetchUserData mit Argument 123 wird aufgerufen
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // Mock gibt diese Daten zurück
                      ->once(); // Erwartet wird, dass die Methode genau einmal aufgerufen wird

        // Testobjekt erstellen, das den Mock erhält
        $userProcessor = new UserProcessor($apiClientMock);

        // Testmethode ausführen
        $result = $userProcessor->processUserData(123);

        // Ergebnis prüfen
        $this->assertTrue($result);

        // Sicherstellen, dass alle Erwartungen erfüllt wurden
        Mockery::close();
    }
}

In diesem Beispiel wird ApiClient durch ein "Mock" ersetzt. Wir "faken" den echten API-Aufruf und konfigurieren den Mock so, dass er bei Aufruf von fetchUserData(123) bestimmte Daten zurückgibt. Außerdem prüfen wir, ob diese Methode mit den richtigen Argumenten und genau einmal aufgerufen wurde. Das ist der entscheidende Unterschied: Der Mock erlaubt die Überprüfung der Interaktion.