Middle
Czym są mocki i stuby? Czym się różnią?
sobes.tech AI
Odpowiedź od AI
Mocki i stuby to typy duplikatów testowych używanych w testach jednostkowych do symulowania zachowania rzeczywistych zależności obiektu.
Stub:
- Zapewnia "stałe" zachowanie dla scenariusza testowego.
- Odpowiada na wywołania metod, zwracając wcześniej zdefiniowane wartości.
- Nie weryfikuje interakcji, jego celem jest dostarczenie danych, aby obiekt testowany mógł kontynuować.
<?php
// Przykład obiektu stub
class StubDatabase {
public function getUserById(int $id): ?array {
// Symulacja wartości zwracanej dla konkretnego ID
if ($id === 1) {
return ['id' => 1, 'name' => 'Test User'];
}
return null;
}
}
Mock:
- Podobny do stub, ale z logiką sprawdzania interakcji.
- Zawiera oczekiwania dotyczące tego, które metody mają być wywołane, ile razy i z jakimi argumentami.
- Test sprawdza nie tylko wynik, ale także poprawność interakcji z mockiem.
<?php
// Przykład obiektu mock
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()) // Oczekujemy jednego wywołania
->method('getUserById')
->with(1) // Oczekiwany argument
->willReturn(['id' => 1, 'name' => 'Test User']); // Oczekiwana wartość zwrotna
$userService = new UserService($databaseMock);
$user = $userService->getUserById(1);
// Sprawdzenie wyniku i interakcji
$this->assertNotEmpty($user);
$this->assertEquals('Test User', $user['name']);
}
}
Tabela porównawcza:
| Cecha | Stub | Mock |
|---|---|---|
| Cel | Dostarczyć dane do testu | Sprawdzić interakcję i dane |
| Weryfikacja | Nie sprawdza interakcji | Sprawdza, jak obiekt z nim współpracuje |
| Logika zachowania | Po prostu zwraca wartości | Zawiera oczekiwania wywołań |
Kto wykonuje assert? |
Obiekt testowany lub klient | Sam mock (przez oczekiwania) |