🎭 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()eLocalDatesimplifica drasticamente a montagem de cenários (Arrange). Evite o uso deArrays.asListeCalendarem novos projetos. 🏁