🧪 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. 🏁