Сброс макетов в Mockito - это функция, которая позволяет повторно использовать фиктивные объекты, очищая их загрязняющие и взаимодействия. Тем не менее, использование `reset ()`, как правило, не рекомендуется, если это абсолютно необходимо, поскольку это может указывать на плохо структурированные тесты. Вот несколько лучших практик для сброса макетов в Mockito:
Понимание, когда использовать `reset ()`
-Избегайте использования `reset ()`: основная причина `reset ()` существует для поддержки макетов, инъецированных контейнером, такими как те, которые используются в устаревшем коде или сторонних интерфейсах. В большинстве случаев, особенно с хорошо разработанным тестовым кодом, вам следует избегать использования `reset ()` и вместо этого сосредоточиться на создании небольших, целенаправленных методов испытаний [2] [4].
- Запах кода: Если вам нужно использовать `reset ()` в рамках метода испытаний, это может быть признаком того, что ваши тесты слишком сложны или покрывают слишком много сценариев. Это может указывать на необходимость рефакторирования ваших тестов или тестируемого кода [2].
Альтернативы `reset ()`
- Создайте новые макет: вместо сброса макетов подумайте о создании новых макетных экземпляров для каждого метода испытаний. Этот подход гарантирует, что каждый тест начинается с чистого сланца, снижая риск взаимодействия из предыдущих тестов, влияющих на текущий [4].
- Используйте `clearInvocations ()`: Если вам нужно только очистить историю вызова (например, для проверки взаимодействий, не влияя на загрязнение), используйте `mockito.clearinvocations ()`. Этот метод удаляет историю вызова без сброса заглушек, которые могут быть полезны в определенных сценариях [4].
лучшие практики сброса макетов
- Сброс после каждого теста: если вы должны сбросить макет, сделайте это после каждого метода испытаний, используя аннотацию `@After` в Junit или` pheseeach () `в Scalatest. Это гарантирует, что каждый тест начинается с чистого макетного состояния [3] [10].
- Избегайте сброса перед тестами: сброс макетов, прежде чем каждый тест может привести к путанице в том, в каком состоянии находится макет в начале теста. Как правило, яснее создавать новые макет или сброс после тестов [10].
- Используйте функции Framework: в таких фреймворках, как Spring, с использованием таких аннотаций, как `@Mockbean ', могут автоматически обрабатывать макет сброс после каждого теста, устраняя необходимость в ручном сбросе [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-an-an-use-us-mockitos-reset-method
[5] https://github.com/mockito/mockito-kotlin/issues/513
[6] https://symflower.com/en/company/blog/2024/how-to-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-mockito