⛓️ 3.9 Validando a Ordem de Execução (InOrder)

Em certos processos críticos, a ordem em que as dependências são invocadas é tão importante quanto a invocação em si. Por exemplo, no encerramento de um leilão, devemos garantir que o leilão seja persistido no banco de dados antes de notificarmos o usuário por e-mail.

🏗️ O Problema da Sequência

Se invertermos a ordem (notificar antes de salvar), corremos o risco de o banco falhar e o usuário receber uma notificação de algo que nunca ocorreu de fato.

📄 Verificação de Elite com inOrder()

O Mockito permite criar um verificador sequencial para garantir que a coreografia entre os Mocks seja respeitada.

@Test
void deveRespeitarAOrdemDePersistenciaENotificacao() {
    var leilao = new CriadorDeLeilao().para("Console")
            .naData(LocalDate.now().minusDays(10)).constroi();
 
    var daoMock = mock(LeilaoDao.class);
    var carteiroMock = mock(Carteiro.class);
    
    when(daoMock.correntes()).thenReturn(List.of(leilao));
 
    var encerrador = new EncerradorDeLeilao(daoMock, carteiroMock);
    encerrador.encerra();
 
    // 1. Criar o verificador de ordem para os Mocks envolvidos
    InOrder order = inOrder(daoMock, carteiroMock);
 
    // 2. Definir a sequência esperada (Passo 1 -> Passo 2)
    order.verify(daoMock).atualiza(leilao);
    order.verify(carteiroMock).envia(leilao);
}

📊 Por que usar InOrder?

VantagemDescrição Técnica
Integridade de FluxoGarante que processos de múltiplas etapas não sejam desordenados.
Segurança FinanceiraEssencial para transações onde o “Commit” deve preceder a notificação.
Diagnóstico de Race ConditionsAjuda a identificar lógicas que dependem de estado mutável compartilhado.

Uso com Moderação ⚡

Use o inOrder() apenas quando a sequência for uma Regra de Negócio Crucial. Validar a ordem em todos os testes pode torná-los excessivamente rígidos e difíceis de manter. 🏁


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