Bij het gebruik van Mockito -argument matchers uitgebreid, zijn er verschillende prestatieoverwegingen om in gedachten te houden. Hoewel Mockito over het algemeen efficiënt is, kan het uitgebreide gebruik van argumentmatchers wat overhead introduceren vanwege de manier waarop Mockito deze matchers verwerkt.
1. Matcher -verwerking overhead **
- Argument Matcher Evaluatie: wanneer u argument matchers gebruikt zoals `eq ()`, `Any ()`, of `anystring ()`, moet Mockito deze matchers tijdens runtime evalueren. Dit evaluatieproces kan een lichte overhead introduceren in vergelijking met het direct doorgeven van exacte waarden. Deze overhead is echter meestal te verwaarlozen, tenzij u te maken hebt met een zeer groot aantal aanroepingen of complexe matchers.2. Matcher -combinatieregels **
- Alle argumenten moeten matchers gebruiken: als u een argumentmatcher voor één argument gebruikt, moeten alle argumenten matchers gebruiken. Deze regel kan leiden tot meer uitgebreide code en mogelijk meer overhead als u matchers gebruikt voor alle argumenten wanneer slechts één een specifieke voorwaarde nodig heeft. Als een methode bijvoorbeeld drie parameters heeft en u `Any ()` voor een van hen wilt gebruiken, moet u ook matchers voor de andere twee gebruiken, zelfs als u exacte waarden had kunnen gebruiken.3. Aangepaste matchers **
- Complexe logica: hoewel Mockito een breed scala aan ingebouwde matchers biedt, moet u mogelijk aangepaste matchers maken voor specifieke logica. Aangepaste matchers kunnen rekenkundig duurder zijn als ze complexe logica of bewerkingen inhouden. Dit komt omdat ze de implementatie van de `argumentmater' -interface moeten implementeren en een` matches () `methode moeten definiëren die willekeurige controles kan uitvoeren.4. Verificatie overhead **
- Verificatie met matchers: bij het verifiëren van interacties met proefobjecten met behulp van `verify ()`, gebruikt Mockito ook matchers om te controleren of de juiste argumenten zijn doorgegeven. Net als bij het stompen kan verificatie met matchers enige overhead introduceren, vooral als u meerdere oproepen verifieert met complexe matchers.5. Best practices voor prestaties **
- Gebruik specificiteit verstandig: gebruik matchers met het juiste niveau van specificiteit. Bijvoorbeeld, `anyint ()` is minder specifiek en sneller dan `eq (4)`, maar met behulp van `eq (4)` wanneer u moet controleren of een specifieke waarde nauwkeuriger is en geen invloed heeft op de prestaties.- Vermijd onnodige complexiteit: vermijd het gebruik van aangepaste matchers tenzij dat nodig is. Als een test complexe logica vereist om argumenten te matchen, overweeg dan om de test te vereenvoudigen of bestaande matchers creatief te gebruiken.
- Profiel uw tests: als u prestatieproblemen in uw tests opmerkt, profileer ze dan om knelpunten te identificeren. Het is zeldzaam dat Mockito -matchers de primaire oorzaak zijn van belangrijke prestatieproblemen, maar het is altijd goed om te verifiëren.
Samenvattend, hoewel Mockito-argument matchers wat overhead introduceren, is dit over het algemeen geen grote zorg, tenzij u te maken hebt met extreem complexe of prestatiekritische tests. De voordelen van het gebruik van matchers zoals flexibiliteit en duidelijkheid in testcode 'wegen meestal op tegen de kleine prestatiekosten.
Citaten:[1] https://stackoverflow.com/questions/56559146/junit-using-eq-argument-matcher-vs-passing-string-direct/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-reyday-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