🔢 3.6 Contando a Quantidade de Invocação

A verificação simples do verify() garante que o método foi chamado. Mas e se ele foi chamado dez vezes por engano? Ou se ele nunca deveria ter sido chamado para um determinado cenário?

🛠️ Modificadores de Quantidade

O Mockito oferece o método times() e outros auxiliares para conferir a precisão da execução.

📄 Exemplo: Precisão no Encerramento

@Test
void deveAtualizarLeiloesUmaUnicaVez() {
    var leilao = new CriadorDeLeilao().para("Fones")
            .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();
 
    // ✅ Verifica que o método foi executado EXATAMENTE uma vez
    verify(daoMock, times(1)).atualiza(leilao);
}

🛡️ Outros Cenários de Verificação

MétodoObjetivo de Engenharia
times(n)Exatamente N vezes.
never()Garante que o método NÃO foi chamado (essencial para cenários de erro).
atLeastOnce()No mínimo uma vez.
atMost(n)No máximo N vezes.

📄 Exemplo: Garantindo que NÃO foi chamado

@Test
void naoDeveAtualizarLeiloesQueComecaramHoje() {
    var hoje = LocalDate.now();
    var leilao = new CriadorDeLeilao().para("Laptop").naData(hoje).constroi();
 
    var daoMock = mock(LeilaoDao.class);
    when(daoMock.correntes()).thenReturn(List.of(leilao));
 
    var encerrador = new EncerradorDeLeilao(daoMock);
    encerrador.encerra();
 
    // ✅ Valida que a regra de negócio protegeu o leilão novo
    verify(daoMock, never()).atualiza(leilao);
}

Rigor Técnico ⚡

Usar times(1) é uma boa prática para documentar que aquele método é sensível à duplicação. Se o loop da produção falhar e processar o mesmo item duas vezes, o teste detectará o bug. 🏁


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