Sobes.tech
Middle

O que são mocks e stubs? Em que eles se diferenciam?

sobes.tech IA

Resposta da IA

Mocks e stubs são tipos de duplicados de teste utilizados em testes unitários para simular o comportamento de dependências reais do objeto.

Stub:

  • Fornece um comportamento "fixo" para um cenário de teste.
  • Responde às chamadas de métodos retornando valores predefinidos.
  • Não verifica a interação, seu objetivo é fornecer dados para que o objeto em teste continue.
<?php
// Exemplo de objeto stub
class StubDatabase {
    public function getUserById(int $id): ?array {
        // Simulação do valor retornado para um ID específico
        if ($id === 1) {
            return ['id' => 1, 'name' => 'Test User'];
        }
        return null;
    }
}

Mock:

  • Semelhante ao stub, mas com lógica de verificação de interação.
  • Contém expectativas sobre quais métodos devem ser chamados, quantas vezes e com quais argumentos.
  • O teste verifica não só o resultado, mas também a interação correta com o mock.
<?php
// Exemplo de objeto 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()) // Espera uma chamada
                     ->method('getUserById')
                     ->with(1) // Espera argumento 1
                     ->willReturn(['id' => 1, 'name' => 'Test User']); // Valor esperado

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

        // Verificação do resultado e da interação
        $this->assertNotEmpty($user);
        $this->assertEquals('Test User', $user['name']);
    }
}

Tabela comparativa:

Característica Stub Mock
Propósito Fornecer dados para o teste Verificar interação e dados
Verificação Não verifica interação Verifica como o objeto interage
Lógica de comportamento Apenas devolve valores Inclui expectativas de chamadas
Quem realiza assert? Objeto em teste ou cliente O próprio mock (através de expectativas)