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