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) |