🧪 1.4 Olá Mundo, JUnit 5!

A automação de testes é o pilar da Entrega Contínua. O JUnit 5 (Jupiter), padrão de mercado para o ecossistema Java moderno, permite validar regras de negócio de forma determinística, fornecendo feedback visual imediato e facilitando a identificação de regressões.

🏗️ Estrutura do Projeto (Padrão Maven/Gradle)

Seguimos a estrutura padrão de diretórios para garantir a modularização:

projeto-leilao/
├── src/
│   ├── main/java/
│   │   └── com/empresa/dominio/  <-- Código de Produção
│   └── test/java/
│       └── com/empresa/servico/ <-- Código de Teste (Espelhado)

📊 Diagrama de Classes do Domínio

classDiagram
    class Leilao {
        -String descricao
        -List~Lance~ lances
        +propoe(Lance lance)
    }
    class Lance {
        -Usuario usuario
        -double valor
    }
    class Usuario {
        -String nome
    }
    class Avaliador {
        -double maiorDeTodos
        -double menorDeTodos
        +avalia(Leilao leilao)
    }
    Leilao "1" *-- "n" Lance
    Lance "n" --> "1" Usuario
    Avaliador ..> Leilao : Processa

🛠️ Passo 1: Configuração do Caso de Teste

Diferente de uma classe main, um teste JUnit 5 deve utilizar a anotação @Test do pacote jupiter. Introduziremos também o AssertJ para asserções fluídas e legíveis.

📄 src/test/java/…/AvaliadorTest.java

package com.empresa.servico;

import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.offset; import org.junit.jupiter.api.Test; import com.empresa.dominio.*;

public class AvaliadorTest {

@Test
public void deveEntenderLancesEmOrdemCrescente() {
    // 1. Cenário (Given)
    var joao = new Usuario("Joao");
    var jose = new Usuario("Jose");
    var maria = new Usuario("Maria");

    var leilao = new Leilao("Playstation 5");
    leilao.propoe(new Lance(maria, 250.0));
    leilao.propoe(new Lance(joao, 300.0));
    leilao.propoe(new Lance(jose, 400.0));

    // 2. Ação (When)
    var leiloeiro = new Avaliador();
    leiloeiro.avalia(leilao);

    // 3. Validação (Then) - Usando AssertJ (Elite Standard)
    assertThat(leiloeiro.getMaiorLance()).isCloseTo(400.0, offset(0.0001));
    assertThat(leiloeiro.getMenorLance()).isCloseTo(250.0, offset(0.0001));
}

}

---

## 🧪 Passo 2: Execução e Feedback

Para executar os testes via linha de comando ou IDE:

```bash
mvn test

Red Bar: Identificando o Bug 🛡️

Se o teste falhar, o JUnit 5 indicará exatamente onde a expectativa divergiu do resultado real. A falha é sua amiga: ela aponta o caminho para a correção antes que o código chegue ao usuário.


🛠️ Passo 3: Refatoração e Correção (Clean Code)

A falha identificada ocorre porque o laço de avaliação não reseta ou verifica corretamente ambos os extremos em certas ordens de entrada. A correção abaixo garante a independência dos checks:

📄 src/main/java/…/servico/Avaliador.java

public void avalia(Leilao leilao) {
    for (Lance lance : leilao.getLances()) {
        if (lance.getValor() > maiorDeTodos) {
            maiorDeTodos = lance.getValor();
        }
        if (lance.getValor() < menorDeTodos) {
            menorDeTodos = lance.getValor();
        }
    }
}

🏆 Vitória da Engenharia Premium

Ao rodar o teste novamente, obteremos a Green Bar.

Feedback Exponencial ⚡

Um suite de testes robusto permite refatorar o código com a segurança de que nenhuma funcionalidade existente foi quebrada. Em projetos de alta performance, os testes são o seu maior ativo de agilidade. 🏁


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