Sobes.tech
Middle

Wat zijn mocks en stubs? Hoe verschillen ze?

sobes.tech AI

Antwoord van AI

Mocks en stubs zijn typen test-duplicaten die in unit tests worden gebruikt om het gedrag van echte afhankelijkheden van het object te simuleren.

Stub:

  • Biedt een "vast" gedrag voor een testsituatie.
  • Reageert op methodeaanroepen door vooraf gedefinieerde waarden terug te geven.
  • Verifieert niet de interactie, het doel is om gegevens te leveren zodat het te testen object kan doorgaan.
<?php
// Voorbeeld van een stub-object
class StubDatabase {
    public function getUserById(int $id): ?array {
        // Simulatie van de geretourneerde waarde voor een specifiek ID
        if ($id === 1) {
            return ['id' => 1, 'name' => 'Test User'];
        }
        return null;
    }
}

Mock:

  • Gelijkaardig aan stub, maar met logica voor het controleren van de interactie.
  • Bevat verwachtingen over welke methoden moeten worden aangeroepen, hoe vaak en met welke argumenten.
  • De test controleert niet alleen het resultaat, maar ook de correcte interactie met de mock.
<?php
// Voorbeeld van een mock-object
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()) // Verwacht één oproep
                     ->method('getUserById')
                     ->with(1) // Verwacht argument 1
                     ->willReturn(['id' => 1, 'name' => 'Test User']); // Verwachte return-waarde

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

        // Resultaat- en interactiecontrole
        $this->assertNotEmpty($user);
        $this->assertEquals('Test User', $user['name']);
    }
}

Vergelijkingstabel:

Kenmerk Stub Mock
Doel Gegevens leveren voor de test Interactie en gegevens controleren
Verificatie Controleert interactie niet Controleert hoe het object ermee omgaat
Gedragslogica Geeft alleen waarden terug Bevat verwachtingen over aanroepen
Wie voert assert uit? Testobject of client De mock zelf (via verwachtingen)