重置模拟物中的模拟是一项功能,它允许您通过清除其固执和互动来重复使用模拟对象。但是,除非绝对必要,否则通常不建议使用`reset()`,因为它可能表明结构不佳的测试。以下是在Mockito中重置模拟的一些最佳实践:
##了解何时使用`reset()'
- 避免使用`reset()`:存在的主要原因`reset()`是为了支持注入容器的模拟,例如在旧版代码或第三方接口中使用的模拟。在大多数情况下,尤其是使用精心设计的测试驱动的代码,您应该避免使用`reset()`而专注于创建小型,集中的测试方法[2] [4]。
- 代码气味:如果您发现自己需要使用`reset()`在测试方法中,这可能表明您的测试太复杂或涵盖了太多场景。这可能表明需要重构测试或正在测试的代码[2]。
##`reset()的替代方案'
- 创建新的模拟:而不是重置模拟,而是考虑为每种测试方法创建新的模拟实例。这种方法可确保每个测试以干净的板岩开头,从而降低了对当前测试的先前测试的相互作用风险[4]。
- 使用`clearInvocations()`:如果您只需要清除调用历史记录(例如,在不影响固执的情况下验证互动),请使用`ockito.clearinvocations()`。此方法可以删除调用历史记录而无需重置存根,这在某些情况下可能很有用[4]。
##重置模拟的最佳实践
- 在每个测试后重置:如果您必须重置模拟,请在每种测试方法之后使用`@@after'injunit in junit或``Aftereach()在scalatest中进行``aftereach()`。这样可以确保每个测试以干净的模拟状态开始[3] [10]。
- 在测试前避免重置:在每个测试之前重置模拟物可能会导致模拟在测试开始时处于哪种状态的困惑。在测试后创建新的模拟或重置通常更清楚[10]。
- 使用框架功能:在诸如Spring之类的框架中,使用``@opoceBean``都可以在每次测试后都会自动处理模拟重置,从而消除了对手动重置的需求[10]。
## 结论
虽然Mockito为特定用例提供了`reset()`方法,但通常建议避免使用其使用更清洁,更集中的测试设计。通过为每个测试创建新的模拟或使用框架功能来管理模拟状态,可以确保不需要手动重置的稳健和可维护的测试。
引用:[1] https://www.tutorialspoint.com/mockito/mockito_resetting_mock.htm
[2] https://site.mockito.org/javadoc/current/org/mockito/mockito.html
[3] https://twitter.github.io/finatra/user-guide/testing/mocks.html
[4] https://softwareengineering.stackexchange.com/questions/188299/is-this-this-an-apprep--use-use-use-ockitos-reset-method
[5] https://github.com/mockito/mockito-kotlin/issues/513
[6] https://symflower.com/en/company/blog/2024/how-to-do-do-mocking-spring-boot/
[7] https://www.lambdatest.com/automation-testing-advisor/selenium/methods/org.mockito.mockito.reset
[8] https://github.com/mockito/mockito/issues/183
[9] https://www.toptal.com/java/a-guide-to-everyday-mockito
[10] https://stackoverflow.com/questions/18164123/how-to-clean-up-mocks-in-spring-tests-when-using-using-susing-susing-mockito