Pular para conteúdo

Aula 11 - Testes com JUnit e Mockito 🧪

Como ter certeza de que sua API continua funcionando depois de cada mudança? Nesta aula, vamos aprender a escrever testes automatizados profissionais.

😊 Por que Testar?

Testes automatizados garantem que seu código funciona como esperado — e, mais importante, continuam funcionando conforme o sistema cresce e é modificado por várias pessoas.

Tipos de Teste

  • Teste Unitário: Testa uma única unidade de código isoladamente (ex: um método do Service).
  • Teste de Integração: Testa a interação entre várias camadas (ex: Controller + Service + banco real).

📊 Pirâmide de Testes

graph TD
    A[Testes E2E - poucos, lentos] --> B[Testes de Integração - médios]
    B --> C[Testes Unitários - muitos, rápidos]

🧠 JUnit: o Framework de Testes do Java

class ProdutoServiceTest {

    @Test
    void deveCalcularDescontoCorretamente() {
        Produto p = new Produto("Mouse", 100.0);
        double resultado = ProdutoService.aplicarDesconto(p, 10);
        assertEquals(90.0, resultado);
    }
}

🧠 Mockito: Simulando Dependências

Important

Lembra da Injeção de Dependências (Aula 03)? Ela é o que torna o Mockito possível: em vez de usar o Repository real (que acessaria o banco de verdade), injetamos um mock — uma versão falsa e controlada.

@ExtendWith(MockitoExtension.class)
class ProdutoServiceTest {

    @Mock
    private ProdutoRepository repository;

    @InjectMocks
    private ProdutoService service;

    @Test
    void deveListarProdutos() {
        when(repository.findAll()).thenReturn(List.of(new Produto("Mouse", 50.0)));

        List<Produto> resultado = service.listar();

        assertEquals(1, resultado.size());
    }
}

📊 Fluxo de um Teste com Mock

graph LR
    Test[Teste] -- Configura --> Mock[Repository Mockado]
    Test -- Chama --> Service
    Service -- Usa --> Mock
    Mock -- Retorna dado falso --> Service
    Service -- Retorna --> Test
    Test -- Verifica --> Assert[Assertivas]

📝 Exercícios Progressivos

  1. Básico: Qual a diferença entre um teste unitário e um teste de integração?
  2. Básico: O que faz a anotação @Test do JUnit?
  3. Intermediário: Por que usamos um Mock do Repository em vez do Repository real em um teste unitário do Service?
  4. Intermediário: O que a Injeção de Dependências (Aula 03) tem a ver com a facilidade de mockar dependências?
  5. Desafio: Escreva um teste que verifica se o método salvar() do Service lança uma exceção quando o produto tem preço negativo.

🚀 Mini-projeto: Escreva 3 testes unitários para o ProdutoService: listar produtos, salvar um produto válido e tentar salvar um produto com preço negativo.