🏗️ 1.15 Design Patterns para Testes: Test Data Builders
Em sistemas complexos, a criação de objetos de domínio pode se tornar verbosa e obscurecer o propósito do teste. O padrão Test Data Builder utiliza uma Interface Fluente (Fluent Interface) para tornar a instanciação de objetos didática, clara e robusta.
📄 Exemplo Premium: Cenário Expressivo
Com o Builder, o “Arrange” (Montagem) do teste torna-se uma frase legível:
@Test
void deveEncontrarOsTresMaioresLances() {
// Escrita Fluente: O cenário é o protagonista
var leilao = new CriadorDeLeilao()
.para("Console Next-Gen")
.lance(joao, 100.0)
.lance(maria, 200.0)
.lance(joao, 300.0)
.lance(maria, 400.0)
.constroi();
leiloeiro.avalia(leilao);
assertThat(leiloeiro.getTresMaiores()).hasSize(3)
.extracting(Lance::getValor)
.containsExactly(400.0, 300.0, 200.0);
}🛠️ Implementando a Fluent Interface
O segredo do Builder é o retorno da própria instância (return this), permitindo o encadeamento de métodos (Chaining).
📄 src/test/java/…/builder/CriadorDeLeilao.java
public class CriadorDeLeilao {
private Leilao leilao;
public CriadorDeLeilao para(String descricao) {
this.leilao = new Leilao(descricao);
return this;
}
public CriadorDeLeilao lance(Usuario usuario, double valor) {
leilao.propoe(new Lance(usuario, valor));
return this;
}
public Leilao constroi() {
return leilao;
}
}📊 Fluxo de Construção de Dados
flowchart LR A["new Criador()"] --> B[".para()"] B --> C[".lance()"] C --> D[".lance()"] D --> E[".constroi()"] E --> F["Leilao Finalizado"] style A fill:#f9f9f9,stroke:#333 style F fill:#e3f2fd,stroke:#1e88e5
Encapsulamento de Instanciação 🛡️
Se o construtor da classe
Leilaomudar, você atualiza apenas o Builder. Seus centenas de testes permanecerão intactos, protegendo seu investimento em qualidade contra mudanças estruturais. 🚀
Quando usar? ⚡
Aplique o Builder sempre que a criação de um cenário exceder 5 linhas ou quando os mesmos objetos complexos forem necessários em múltiplos arquivos de teste. 🏁