Sobes.tech
Middle

Qu'est-ce que les mocks et les stubs ? En quoi diffèrent-ils ?

sobes.tech IA

Réponse de l'IA

Les mocks et stubs sont des types de doublures de test utilisés en test unitaire pour simuler le comportement des dépendances réelles de l'objet.

Stub :

  • Fournit un comportement "fixe" pour un scénario de test.
  • Répond aux appels de méthodes en renvoyant des valeurs prédéfinies.
  • Ne vérifie pas l'interaction, son objectif est de fournir des données pour que l'objet testé continue.
<?php
// Exemple d'objet stub
class StubDatabase {
    public function getUserById(int $id): ?array {
        // Simulation de la valeur de retour pour un ID spécifique
        if ($id === 1) {
            return ['id' => 1, 'name' => 'Test User'];
        }
        return null;
    }
}

Mock :

  • Semblable au stub, mais avec une logique de vérification de l'interaction.
  • Contient des attentes sur les méthodes qui doivent être appelées, combien de fois et avec quels arguments.
  • Le test vérifie non seulement le résultat, mais aussi la bonne interaction avec le mock.
<?php
// Exemple d'objet 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()) // Attente d'un appel
                     ->method('getUserById')
                     ->with(1) // Attente de l'argument 1
                     ->willReturn(['id' => 1, 'name' => 'Test User']); // Valeur de retour attendue

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

        // Vérification du résultat et de l'interaction
        $this->assertNotEmpty($user);
        $this->assertEquals('Test User', $user['name']);
    }
}

Tableau comparatif :

Caractéristique Stub Mock
Objectif Fournir des données pour le test Vérifier interaction et données
Vérification Ne vérifie pas l'interaction Vérifie comment l'objet interagit
Logique de comportement Retourne simplement des valeurs Contient des attentes d'appels
Qui fait assert? Objet ou client en test Le mock lui-même (via attentes)