🎭 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
LeilaoDaoganhar 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. 🏁