🎭 3.1 Simulando a Infraestrutura: O Uso de Fakes

Tentar testar o EncerradorDeLeilao contra um banco de dados real transformaria um teste de unidade em um Teste de Integração. Testes que tocam o HD ou a rede são lentos, flutuantes (flaky) e difíceis de resetar.

🏁 O Problema do Banco de Dados em Testes

Um teste dependente de SQL exige INSERT/DELETE constantes, o que polui o ambiente e desacelera o ciclo de feedback da equipe.

@Test
void deveEncerrarLeiloesCenárioReal() {
    // ❌ LENTO: Exige banco configurado e limpeza de estado
    var dao = new LeilaoDao(); 
    dao.salva(leilaoAntigo);
    
    var encerrador = new EncerradorDeLeilao(dao);
    encerrador.encerra();
    
    assertThat(dao.encerrados()).hasSize(1);
}

🏗️ A Solução Manual: O DAO Falso (Stub/Fake)

Podemos criar uma implementação de “mentira” que armazena os dados em uma List na memória. Isso garante velocidade e isolamento total.

📄 src/test/java/…/dubles/LeilaoDaoFalso.java

public class LeilaoDaoFalso implements LeilaoDao {
    private final List<Leilao> leiloes = new ArrayList<>();
 
    @Override
    public void salva(Leilao leilao) {
        leiloes.add(leilao);
    }
 
    @Override
    public List<Leilao> correntes() {
        return leiloes.stream()
                .filter(l -> !l.isEncerrado())
                .toList();
    }
 
    @Override
    public void atualiza(Leilao leilao) {
        // Nada a fazer: o objeto já está na lista em memória 🚀
    }
}

📊 Fluxo de Teste Isolado

flowchart LR
    A["Teste de Unidade"] --> B["Encerrador"]
    B -- "Busca Lances" --> C["LeilaoDaoFalso (RAM)"]
    C -- "Retorna Lista" --> B
    B -- "Assert (Total +1)" --> A
    style C fill:#f1f8e9,stroke:#558b2f

O Custo de Manutenção 🛡️

Embora o DAO Falso resolva o problema da velocidade, ele cria um novo problema: Manutenção. Se a interface LeilaoDao ganhar 10 novos métodos, você terá que implementar todos no seu Fake. No próximo capítulo, utilizaremos o Mockito 5 para automatizar esta tarefa. 🏁


⬅️ Capítulo Anterior | Próximo Capítulo ➡️