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