🛡️ 3.5 Garantindo Invocação de Métodos

Testar o estado final de um objeto (se ele foi encerrado ou não) é apenas metade da batalha. Precisamos garantir que os efeitos colaterais necessários ocorreram, como a persistência dos dados no banco.

🏗️ O Conceito de Verificação

Se estamos usando um Mock, não há um banco real para consultar com SELECT. Precisamos “perguntar” ao Mock se ele foi chamado com os parâmetros corretos.

📄 Exemplo de Verificação de Interação

@Test
void deveAtualizarLeiloesEncerrados() {
    var hoje = LocalDate.now();
    var antiga = hoje.minusDays(10);
 
    var leilao1 = new CriadorDeLeilao().para("Console")
            .naData(antiga).constroi();
 
    var daoMock = mock(LeilaoDao.class);
    when(daoMock.correntes()).thenReturn(List.of(leilao1));
 
    var encerrador = new EncerradorDeLeilao(daoMock);
    encerrador.encerra();
 
// ✅ VERIFICAÇÃO DE ELITE: O método foi chamado com este leilão exato?
verify(daoMock).atualiza(leilao1);

}

---
 
## 📊 Por que o `verify()` é inteligente?
 
O Mockito utiliza o `equals()` do objeto passado para garantir que a chamada foi feita exatamente com o dado esperado. Se o `encerra()` chamasse o `atualiza()` com um leilão diferente (ou não chamasse), o teste falharia instantaneamente.
 
> [!IMPORTANT] Teste do Efeito Colateral 🛡️
> 
> Se você apagar a linha `dao.atualiza(leilao)` do seu código de produção, o teste acima falhará. Isso garante que a regra de persistência nunca seja removida acidentalmente durante uma refatoração. 🚀
 
---
 
## 📦 Dica de Clean Test
Sempre utilize o `verify()` para métodos `void` que representam passos críticos da regra de negócio (Atualizar DB, Enviar Email, Disparar Evento). 🏁

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