🏗️ 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 Leilao mudar, 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. 🏁


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