Questa è un'ottima domanda! Penso che la causa principale sia la seguente, stiamo usando JUnit non solo per test unitari. Quindi la domanda dovrebbe essere divisa:
- Dovrei usare Mockito.verify () nei miei test di integrazione (o qualsiasi altro test superiore all'unità)?
- Dovrei usare Mockito.verify () nel mio test unitario della scatola nera ?
- Dovrei usare Mockito.verify () nel mio test unitario in scatola bianca ?
quindi se ignoreremo i test superiori alle unità, la domanda può essere riformulata "L' uso del test unitario in white box con Mockito.verify () crea una grande coppia tra i test unitari e la mia possibile implementazione, posso creare un " riquadro grigio " unit test e quali regole empiriche dovrei usare per questo ".
Ora esaminiamo tutto questo passo per passo.
* - Dovrei usare Mockito.verify () nella mia integrazione test di (o qualsiasi altro test superiore all'unità)? * Penso che la risposta sia chiaramente no, inoltre non dovresti usare mock per questo. Il test dovrebbe essere il più vicino possibile all'applicazione reale. Stai testando il caso d'uso completo, non parte isolata dell'applicazione.
* test di unità black-box vs white-box * Se stai usando l' approccio black-box su cosa stai realmente facendo, fornisci input (tutte le classi di equivalenza), uno stato e test che riceverai l'output previsto. In questo approccio l'uso delle beffe in generale è giustificato (semplicemente imiti che stanno facendo la cosa giusta; non vuoi metterle alla prova), ma chiamare Mockito.verify () è superfluo.
Se stai usando l' approccio white-box che cosa stai realmente facendo, stai testando il comportamento della tua unità. In questo approccio è essenziale chiamare Mockito.verify (), è necessario verificare che l'unità si comporti come previsto.
regole del pollice per il test della scatola grigia
Il problema con il test della scatola bianca è che crea un accoppiamento elevato. Una possibile soluzione è quella di eseguire test su scatola grigia, non su scatola bianca. Questa è una sorta di combinazione di test in bianco e nero. Stai davvero testando il comportamento della tua unità come nei test white-box, ma in generale la rendi indipendente dall'implementazione quando possibile . Quando è possibile, effettuerai un controllo come nel caso di una scatola nera, asserendo solo che l'output è quello che ti aspetti. Quindi, l'essenza della tua domanda è quando è possibile.
Questo è davvero difficile. Non ho un buon esempio, ma posso darti degli esempi. Nel caso che è stato menzionato sopra con equals () vs equalsIgnoreCase () non dovresti chiamare Mockito.verify (), basta affermare l'output. Se non è possibile farlo, suddividere il codice nell'unità più piccola, fino a quando non è possibile farlo. D'altra parte, supponi di avere un po 'di @Service e stai scrivendo @ Web-Service che è essenzialmente un wrapper sul tuo @Service - delega tutte le chiamate al @Service (e sta facendo qualche gestione extra degli errori). In questo caso è essenziale chiamare Mockito.verify (), non è necessario duplicare tutti i controlli effettuati per @Serive, verificando che sia sufficiente chiamare @Service con l'elenco di parametri corretto.