Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Ci sono considerazioni sulle prestazioni quando si utilizzano ampiamente gli argomenti di mockito


Ci sono considerazioni sulle prestazioni quando si utilizzano ampiamente gli argomenti di mockito


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