⛓️ 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?
| Vantagem | Descrição Técnica |
|---|---|
| Integridade de Fluxo | Garante que processos de múltiplas etapas não sejam desordenados. |
| Segurança Financeira | Essencial para transações onde o “Commit” deve preceder a notificação. |
| Diagnóstico de Race Conditions | Ajuda 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. 🏁