🛡️ 3.7 Capturando o Estado Final com ArgumentCaptor

Muitas vezes, não queremos apenas verificar se um método foi chamado, mas sim analisar o objeto exato que foi passado para ele. Isso é comum quando a classe de serviço cria ou modifica o objeto internamente antes de enviá-lo ao DAO.

🏗️ O Padrão ArgumentCaptor

O ArgumentCaptor permite interceptar o argumento passado para o Mock para que possamos realizar asserções detalhadas sobre ele após a execução.

📄 Exemplo: Validando Dados Processados

@Test
void deveVerificarOEstadoDoLeilaoAoAtualizar() {
    var leilao = new CriadorDeLeilao().para("Console")
            .naData(LocalDate.now().minusDays(10)).constroi();
 
    var daoMock = mock(LeilaoDao.class);
    when(daoMock.correntes()).thenReturn(List.of(leilao));
 
    var encerrador = new EncerradorDeLeilao(daoMock);
    encerrador.encerra();
 
    // 1. Criar o Captor para a classe Leilao
    ArgumentCaptor<Leilao> captor = ArgumentCaptor.forClass(Leilao.class);
    
    // 2. Interceptar a chamada do método atualiza()
    verify(daoMock).atualiza(captor.capture());
    
    // 3. Validar o objeto capturado com AssertJ
    Leilao leilaoEncerrado = captor.getValue();
    assertThat(leilaoEncerrado.isEncerrado()).isTrue();
    assertThat(leilaoEncerrado.getDescricao()).isEqualTo("Console");
}

📊 Por que usar o Captor?

CenárioUso do Captor
Objetos NovosQuando o objeto é criado com new dentro do método testado.
Mutação de EstadoPara garantir que atributos específicos foram alterados antes do save.
ComplexidadeQuando a verificação simples de igualdade (verify(mock).metodo(obj)) não é suficiente.

Injeção e Captura 🚀

O ArgumentCaptor é a ferramenta definitiva para garantir que suas camadas de serviço estão entregando dados íntegros para as camadas de persistência. 🏁


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