Atunci când utilizați pe larg potriviri de argumente Mockito, există mai multe considerente de performanță de care trebuie să țineți cont. În timp ce Mockito este în general eficient, utilizarea pe scară largă a potrivirilor de argumente poate introduce unele cheltuieli generale datorită modului în care Mockito procesează aceste potriviri.
1. Matcher Processing overhead
- Evaluarea argumentului Matcher: Când utilizați argumente potrivite precum `eq ()`, `any ()`, sau `anyString ()`, Mockito trebuie să evalueze aceste potriviri la runtime. Acest proces de evaluare poate introduce direct o ușoară cheltuială în comparație cu trecerea valorilor exacte. Cu toate acestea, acest cheltuieli generale este de obicei neglijabil, cu excepția cazului în care aveți de -a face cu un număr foarte mare de invocații sau potriviri complexe.2. Reguli de combinație Matcher **
- Toate argumentele trebuie să utilizeze potriviri: dacă utilizați un mecir de argument pentru un argument, toate argumentele trebuie să utilizeze potriviri. Această regulă poate duce la mai mult cod verbos și, eventual, mai mult, dacă utilizați potriviri pentru toate argumentele atunci când doar unul are nevoie de o condiție specifică. De exemplu, dacă o metodă are trei parametri și doriți să utilizați „orice ()` pentru unul dintre ei, trebuie să utilizați Matchers și pentru celelalte două, chiar dacă ați putea folosi valori exacte.3. Matchers personalizate **
- Logică complexă: în timp ce Mockito oferă o gamă largă de potriviri încorporate, este posibil să fie nevoie să creați potriviri personalizate pentru o logică specifică. Matcher -urile personalizate pot fi mai scumpe din punct de vedere calculat dacă implică o logică sau operații complexe. Acest lucru se datorează faptului că acestea necesită implementarea interfeței „ArgumentMatcher” și definirea unei metode `Matches ()` care poate efectua verificări arbitrare.#######.
- Verificare cu potriviri: Când verificați interacțiunile cu obiectele Mock folosind `Verify ()`, Mockito folosește, de asemenea, potriviri pentru a verifica dacă argumentele corecte au fost trecute. Similar cu Stubbing, verificarea cu Matchers poate introduce unele cheltuieli generale, mai ales dacă verificați mai multe apeluri cu potriviri complexe.
5. Cele mai bune practici pentru performanță **
- Utilizați specificitatea cu înțelepciune: folosiți potriviri cu nivelul potrivit de specificitate. De exemplu, `anyint ()` este mai puțin specific și mai rapid decât `eq (4)`, dar utilizarea `eq (4)` atunci când trebuie să verificați o valoare specifică este mai precisă și nu are un impact semnificativ asupra performanței.- Evitați complexitatea inutilă: evitați utilizarea potrivirilor personalizate, cu excepția cazului în care este necesar. Dacă un test necesită o logică complexă pentru a se potrivi cu argumente, luați în considerare simplificarea testului sau utilizarea în mod creativ de potriviri existente.
- Profilați -vă testele: Dacă observați probleme de performanță în testele dvs., profilați -le pentru a identifica blocajele. Este rar ca Mockito Matchers să fie principala cauză a problemelor semnificative de performanță, dar este întotdeauna bine să verificați.
În rezumat, în timp ce potrivitorii de argumente Mockito introduc unele cheltuieli generale, aceasta nu este în general o preocupare semnificativă decât dacă aveți de-a face cu teste extrem de complexe sau critice de performanță. Beneficiile utilizării potrivirilor, cum ar fi flexibilitatea și claritatea codului de testare, de obicei depășesc costurile minore de performanță.
Citări:[1] https://stackoverflow.com/questions/56559146/junit-using-eq-argument-matcher-vs-passing-string-directly/56572275
[2] https://www.digitacean.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-should-i-use-argument-matcher-or-passing-argument-direct-when-mockito-UNI