Sobes.tech
Middle

Was sind Mocks und Stubs? Worin unterscheiden sie sich?

sobes.tech KI

Antwort von AI

Mocks und Stubs sind Test-Doppeltypen, die im Unit-Test verwendet werden, um das Verhalten echter Abhängigkeiten des Objekts zu simulieren.

Stub:

  • Bietet ein "festes" Verhalten für ein Testszenario.
  • Reagiert auf Methodenaurufe, indem es vordefinierte Werte zurückgibt.
  • Überprüft nicht die Interaktion, sein Ziel ist es, Daten bereitzustellen, damit das zu testende Objekt weiterarbeiten kann.
<?php
// Beispiel für ein Stub-Objekt
class StubDatabase {
    public function getUserById(int $id): ?array {
        // Simulation des Rückgabewerts für eine bestimmte ID
        if ($id === 1) {
            return ['id' => 1, 'name' => 'Test User'];
        }
        return null;
    }
}

Mock:

  • Ähnlich wie Stub, aber mit Logik zur Überprüfung der Interaktion.
  • Enthält Erwartungen, welche Methoden aufgerufen werden sollen, wie oft und mit welchen Argumenten.
  • Der Test überprüft nicht nur das Ergebnis, sondern auch die korrekte Interaktion mit dem Mock.
<?php
// Beispiel für ein Mock-Objekt
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\MockObject\MockObject;

class UserServiceTest extends TestCase {
    public function testGetUserByIdCallsDatabase(): void {
        $databaseMock = $this->createMock(Database::class);
        $databaseMock->expects($this->once()) // Erwartet einen Aufruf
                     ->method('getUserById')
                     ->with(1) // Erwartet Argument 1
                     ->willReturn(['id' => 1, 'name' => 'Test User']); // Erwarteter Rückgabewert

        $userService = new UserService($databaseMock);
        $user = $userService->getUserById(1);

        // Überprüfung des Ergebnisses und der Interaktion
        $this->assertNotEmpty($user);
        $this->assertEquals('Test User', $user['name']);
    }
}

Vergleichstabelle:

Merkmal Stub Mock
Zweck Daten für den Test bereitstellen Interaktion und Daten prüfen
Überprüfung Überprüfung der Interaktion nicht Überprüfung, wie das Objekt interagiert
Verhaltenslogik Gibt nur Werte zurück Enthält Erwartungen an Aufrufe
Wer führt `assert`` aus? Testobjekt oder Client Der Mock selbst (über Erwartungen)