当广泛使用Mockito参数匹配者时,请记住几个绩效注意事项。尽管Mockito通常是有效的,但由于摩擦摩托的过程这些匹配者的方式,广泛使用参数匹配者可以引入一些开销。
1。匹配器处理开销**
- 参数匹配器评估:当您使用诸如eq()``任何()``任何()或`anystring()的参数匹配器时,Mockito需要在运行时评估这些匹配器。与直接传递精确值相比,此评估过程可以引入轻微的开销。但是,除非您要处理大量的起价或复杂的匹配器,否则该开销通常可以忽略不计。2。匹配器组合规则**
- 所有参数必须使用匹配器:如果您将参数匹配器用于一个参数,则所有参数必须使用匹配器。如果您只需要特定条件,则此规则可能会导致更多的详细代码,并有可能为所有参数使用Matchers。例如,如果一种方法具有三个参数,并且您要使用``任何()```对于其中一个'',则必须对其他两个使用匹配器,即使您可以使用精确的值。3。自定义匹配器**
- 复杂的逻辑:虽然Mockito提供了广泛的内置匹配器,但您可能需要为特定逻辑创建自定义匹配器。如果自定义匹配器涉及复杂的逻辑或操作,则可以更昂贵。这是因为他们需要实现`congrionMatcher`界面并定义可以执行任意检查的方法定义''matches()。4。验证开销**
- 使用Matchers验证:使用“ verify()”验证与模拟对象的交互时,Mockito还使用匹配器检查是否传递了正确的参数。与固执相似,使用Matchers的验证可以引入一些开销,尤其是当您使用复杂匹配器验证多个呼叫时。5。性能的最佳实践**
- 明智地使用特异性:使用具有适当特异性级别的匹配器。例如,“ Anyint()”比EQ(4)``anyint()'',但是当您需要验证特定值时,使用eq(4)'更精确并且不会显着影响性能。- 避免不必要的复杂性:除非必要,否则避免使用自定义匹配器。如果测试需要复杂的逻辑来匹配参数,请考虑简化测试或创造性地使用现有匹配器。
- 配置测试:如果您在测试中注意到性能问题,请配置它们以识别瓶颈。摩根托匹配者很少是造成重大性能问题的主要原因,但是验证总是很好。
总而言之,尽管Mockito参数匹配者确实引入了一些开销,但除非您要处理极其复杂或至关重要的测试,否则这通常不是一个重大问题。在测试代码中使用匹配器(例如灵活性和清晰度)的好处通常超过较小的性能成本。
引用:[1] https://stackoverflow.com/questions/56559146/junit-using-eq-argument-matcher-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-should-i-i-i-i-i-is-rgument-matcher-or-passing-argument-directly-directly-directly-directly-directly-nen-mockito-uni