🎭 3.2 Mockito 5: Dominando os Objetos Dublês

Gerar implementações manuais (Fakes) para cada interface é ineficiente. O Mockito 5 é o framework padrão da indústria para criar “Dublês” dinâmicos, permitindo simular comportamentos complexos com poucas linhas de código.

🏗️ Anatomia de um Mock Moderno

Diferente do Fake manual, o Mockito gera a classe em tempo de execução. Podemos programar exatamente o que cada método deve responder.

📄 Configuração de Elite (BDDMockito)

Enquanto o when().thenReturn() é comum, o padrão BDD (Behavior Driven Development) utiliza uma sintaxe mais legível:

import static org.mockito.BDDMockito.*;
 
// 1. Criar o Dublê
LeilaoDao dao = mock(LeilaoDao.class);
 
// 2. Programar Comportamento (Estilo BDD)
given(dao.correntes()).willReturn(listaDeLeiloes);

🧪 Teste de Unidade com Mockito 5

import static org.mockito.Mockito.*;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test;
 
class EncerradorDeLeilaoTest {
 
    @Test
    void deveEncerrarLeiloesQueComecaramUmaSemanaAtras() {
        var antiga = LocalDate.of(2023, 1, 1);
        
        var leilao1 = new CriadorDeLeilao().para("TV")
                .naData(antiga).constroi();
        var leilao2 = new CriadorDeLeilao().para("Geladeira")
                .naData(antiga).constroi();
        var leiloesAntigos = List.of(leilao1, leilao2);
 
        // Instanciando o Mock
        var daoMock = mock(LeilaoDao.class);
 
        // Programando o cenário: "Dado que o DAO retorne os leilões antigos..."
        when(daoMock.correntes()).thenReturn(leiloesAntigos);
 
        var encerrador = new EncerradorDeLeilao(daoMock);
        encerrador.encerra();
 
        // Validações com AssertJ
        assertThat(leilao1.isEncerrado()).isTrue();
        assertThat(leilao2.isEncerrado()).isTrue();
        assertThat(encerrador.getTotalEncerrados()).isEqualTo(2);
    }
}

📊 Vantagens da Engenharia com Mocks

flowchart TD
    A["Feedback Loop"] --> B["Testes rodam em < 10ms"]
    C["Isolamento de Erro"] --> D["Falha no BD não quebra lógica de negócio"]
    E["Determinismo"] --> F["O teste passa sempre, em qualquer máquina"]
    style A fill:#e3f2fd,stroke:#1e88e5
    style C fill:#f1f8e9,stroke:#558b2f

Injeção por Construtor 🛡️

Para habilitar o uso de Mocks, sua classe de serviço deve aceitar a interface no construtor. Isso é a base do Clean Architecture. 🚀


Dica de Ouro ⚡

No Mockito 5, o uso de List.of() e LocalDate simplifica drasticamente a montagem de cenários (Arrange). Evite o uso de Arrays.asList e Calendar em novos projetos. 🏁


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