Quando si utilizza ampiamente i matcher di argomenti di mockito, ci sono diverse considerazioni sulle prestazioni da tenere a mente. Mentre Mockito è generalmente efficiente, l'ampio uso degli argomenti può introdurre alcune spese generali a causa del modo in cui Mockito elabora questi matcher.
1. Overhead di elaborazione del matcher **
- Valutazione dei matcher argomenti: quando usi matcher di argomenti come `eq ()`, any () `o` anystring () `, mockito deve valutare questi matcher in fase di esecuzione. Questo processo di valutazione può introdurre un leggero sovraccarico rispetto al passaggio direttamente dei valori esatti. Tuttavia, questo sovraccarico è in genere trascurabile a meno che tu non abbia a che fare con un numero molto elevato di invocazioni o matcher complessi.2. Regole di combinazione del matcher **
- Tutti gli argomenti devono utilizzare i matcher: se si utilizza un argomento per un argomento, tutti gli argomenti devono usare i matcher. Questa regola può portare a un codice più verbosio e potenzialmente più sovraccarico se si utilizzano i matcher per tutti gli argomenti quando solo uno ha bisogno di una condizione specifica. Ad esempio, se un metodo ha tre parametri e si desidera utilizzare `qualsiasi ()` per uno di essi, è necessario utilizzare i matcher anche per gli altri due, anche se avresti potuto usare valori esatti.3. Matcher personalizzati **
- Logica complessa: mentre Mockito fornisce una vasta gamma di accompagnatori integrati, potrebbe essere necessario creare matcher personalizzati per una logica specifica. Gli accompagnatori personalizzati possono essere più computazionalmente costosi se coinvolgono logiche o operazioni complesse. Questo perché richiedono l'implementazione dell'interfaccia `argomentalmatcher` e la definizione di un metodo` matches () `che può eseguire controlli arbitrari.4. Verifica overhead **
- Verifica con gli accompagnatori: quando si verificano le interazioni con gli oggetti simulati usando `verifica ()`, mockito usa anche i matcher per verificare se gli argomenti corretti sono stati passati. Simile allo stubing, la verifica con i matcher può introdurre alcuni sovraccarichi, soprattutto se si verificano più chiamate con matcher complessi.5. Best practice per le prestazioni **
- Usa saggiamente la specificità: usa i matcher con il giusto livello di specificità. Ad esempio, `anyint ()` è meno specifico e più veloce di `eq (4)`, ma usare `eq (4)` quando è necessario verificare un valore specifico è più preciso e non ha un impatto significativo sulle prestazioni.- Evitare la complessità inutile: evitare di utilizzare i matcher personalizzati se non necessario. Se un test richiede una logica complessa per abbinare gli argomenti, considera di semplificare il test o utilizzare in modo creativo i matcher esistenti.
- Profila i tuoi test: se noti i problemi di prestazioni nei test, profilali per identificare i colli di bottiglia. È raro che i matcher di mockito siano la causa principale di significativi problemi di prestazioni, ma è sempre bene verificare.
In sintesi, mentre gli argomenti di mockito introducono un po 'di spese generali, generalmente non è una preoccupazione significativa a meno che tu non abbia a che fare con test estremamente complessi o critici per le prestazioni. I vantaggi dell'utilizzo dei matcher come flessibilità e chiarezza nel codice di prova di solito superano i costi di prestazioni minori.
Citazioni:[1] https://stackoverflow.com/questions/56559146/junit-using-eq-argument-matcher-vs-passing-string-directly/56572275
[2] https://www.digitalocean.com/community/tutorials/mockito-argument-matchers-any-eq
[3] https://kenkousen.substack.com/p/tales-from-the-jar-side-a-mockito
[4] https://www.softwaretestinghelp.com/mockito-matchers/
[5] https://www.toptal.com/java/a-guide-to-everyday-mockito
[6] https://github.com/etorreborre/specs2/issues/854
[7] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.mockito.additionalmatchers
[8] https://stackoverflow.com/questions/73046134/when-hould-i-use-argument-matcher-or-passing-argument-drectly-when-mockito-uni