Java verifica il metodo void chiamate n volte con Mockito


141

Sto cercando di verificare che un metodo (vuoto) venga chiamato all'interno di un DAO - Sto usando un punto di commit che invia un elenco di risultati fino a quel punto, reimposta l'elenco e continua. Supponiamo che io abbia 4 elementi nell'elenco e che abbia un punto di commit 1, mi aspetto che il metodo "invia" venga chiamato 4 volte. Posso verificare che il metodo venga chiamato una volta scrivendo

Mockito.verify(mock).send()

passa .. ma voglio verificare il numero di volte che è stato chiamato. Lo penso

Mockito.verify(mock.send(), times(4))

sarebbe sufficiente, ma dice che i parametri non sono corretti per la verifica.

Per inciso, se cambio Mockito.verify(mock).send()a Mockito.verify(mock.send())o Mockito.verify((mock).send())ottengo lo stesso errore. Pensi su questo?


10
Prova Mockito.verify(mock, times(4)).send(). Mi chiedo perché hai "spostato" la send()chiamata del verifymetodo all'interno del metodo. Hai già avuto la sintassi giusta.
Tom,


Nota anche che se non ti interessa quante volte viene chiamato qualcosa, puoi scrivereverify(mock, atLeastOnce()).send();
Dawood ibn Kareem,

Grazie, è corretto. Ciò che ho trovato confuso è che è Mockito.verify(mock).send()passato ma l'incapsulamento ha causato un errore, che non cambia nulla. tuttavia, è una vittoria!
nbpeth,

Risposte:


238

Il metodo necessario è Mockito # verifica :

public static <T> T verify(T mock,
                           VerificationMode mode)

mockè il tuo oggetto deriso ed modeè quello VerificationModeche descrive come verificare la derisione. Le modalità possibili sono :

verify(mock, times(5)).someMethod("was called five times");
verify(mock, never()).someMethod("was never called");
verify(mock, atLeastOnce()).someMethod("was called at least once");
verify(mock, atLeast(2)).someMethod("was called at least twice");
verify(mock, atMost(3)).someMethod("was called at most 3 times");
verify(mock, atLeast(0)).someMethod("was called any number of times"); // useful with captors
verify(mock, only()).someMethod("no other method has been called on the mock");

MockitoPer utilizzare il verifymetodo e queste modalità di verifica sono necessarie queste importazioni statiche dalla classe :

import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

Quindi nel tuo caso la sintassi corretta sarà:

Mockito.verify(mock, times(4)).send()

Ciò verifica che il metodo sia sendstato chiamato 4 volte sull'oggetto deriso. Fallirà se è stato chiamato meno o più di 4 volte.


Se vuoi solo controllare, se il metodo è stato chiamato una volta, non è necessario passare a VerificationMode. Un semplice

verify(mock).someMethod("was called once");

sarebbe abbastanza. Usa internamente verify(mock, times(1)).someMethod("was called once");.


È possibile avere più chiamate di verifica sullo stesso mock per ottenere una verifica "tra". Mockito non supporta qualcosa del genere verify(mock, between(4,6)).someMethod("was called between 4 and 6 times");, ma possiamo scrivere

verify(mock, atLeast(4)).someMethod("was called at least four times ...");
verify(mock, atMost(6)).someMethod("... and not more than six times");

invece, per ottenere lo stesso comportamento. I limiti sono inclusi , quindi il test case è verde quando il metodo è stato chiamato 4, 5 o 6 volte.


1
Per chiunque cerchi di trovare dove sono i VerificationModemetodi (per importazione statica o riferimento esplicito), si trovano org.mockito.internal.verification.VerificationModeFactory.
Steve Chambers,

verify(mock, atLeast(0)).someMethod("was called any number of times");è stato utile ignorare una verifica della chiamata
tj-recess

2
c'è qualcosa di simile verify(between(m,n))che verifica il numero di chiamate tra me n?
nishant

2
@nishant No, Mockito non sembra supportarlo, ma puoi telefonare verifya volte atLeast(M)e atMost(n)ottenere lo stesso comportamento. Ho modificato la risposta spiegando che.
Tom,

@KevinWelker Hai ragione, ho rimosso le informazioni su VerificationModeFactory. È ancora disponibile nella versione più recente, ma concordo sul fatto che le classi interne non dovrebbero essere utilizzate.
Tom,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.