🔢 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étodo | Objetivo 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. 🏁