🛡️ 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ário | Uso do Captor |
|---|---|
| Objetos Novos | Quando o objeto é criado com new dentro do método testado. |
| Mutação de Estado | Para garantir que atributos específicos foram alterados antes do save. |
| Complexidade | Quando 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. 🏁