Sobes.tech
Middle

Cosa sono i mock e gli stub? In cosa si differenziano?

sobes.tech AI

Risposta dell'AI

Mock e stub sono tipi di duplicati di test utilizzati nei test unitari per simulare il comportamento delle dipendenze reali dell'oggetto.

Stub:

  • Fornisce un comportamento "fisso" per uno scenario di test.
  • Risponde alle chiamate ai metodi restituendo valori predefiniti.
  • Non verifica l'interazione, il suo scopo è fornire dati affinché l'oggetto in test possa continuare.
<?php
// Esempio di oggetto stub
class StubDatabase {
    public function getUserById(int $id): ?array {
        // Simulazione del valore restituito per un ID specifico
        if ($id === 1) {
            return ['id' => 1, 'name' => 'Test User'];
        }
        return null;
    }
}

Mock:

  • Simile allo stub, ma con logica di verifica dell'interazione.
  • Contiene aspettative su quali metodi devono essere chiamati, quante volte e con quali argomenti.
  • Il test verifica non solo il risultato, ma anche la corretta interazione con il mock.
<?php
// Esempio di oggetto 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()) // Attende una chiamata
                     ->method('getUserById')
                     ->with(1) // Attende argomento 1
                     ->willReturn(['id' => 1, 'name' => 'Test User']); // Valore di ritorno atteso

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

        // Verifica risultato e interazione
        $this->assertNotEmpty($user);
        $this->assertEquals('Test User', $user['name']);
    }
}

Tabella comparativa:

Caratteristica Stub Mock
Scopo Fornire dati per il test Verificare interazione e dati
Verifica Non verifica l'interazione Verifica come l'oggetto interagisce
Logica di comportamento Restituisce semplicemente valori Contiene aspettative di chiamata
Chi esegue assert? Oggetto o client in test Il mock stesso (tramite aspettative)