Sobes.tech
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)