При широком использовании аргументов Mockito, существует несколько соображений производительности, которые следует иметь в виду. В то время как Mockito, как правило, эффективен, широкое использование сопоставления аргументов может ввести некоторые накладные расходы из -за того, как Mockito обрабатывает эти совпадения.
1. Обработка маттера **
- Оценка соответствия аргументов: когда вы используете соответствующие аргументы, такие как `eq ()`, `anty ()` или `anyString ()`, Mockito необходимо оценить этих маттера во время выполнения. Этот процесс оценки может привести к небольшому накладному расходу по сравнению с точными точными значениями. Тем не менее, этот накладчик обычно незначителен, если вы не имеете дело с очень большим количеством призывов или сложных совпадений.2. Правила комбинации маттера **
- Все аргументы должны использовать сопоставщики: если вы используете совместимый с аргументом для одного аргумента, все аргументы должны использовать совпадения. Это правило может привести к большему условному коду и потенциально большему накладным расходам, если вы используете совпадения для всех аргументов, когда только одно нужно определенное условие. Например, если метод имеет три параметра, и вы хотите использовать `anty ()` для одного из них, вы должны использовать совпадения и для двух других, даже если бы вы могли использовать точные значения.3. Пользовательские совпадения **
- Комплексная логика: в то время как Mockito предоставляет широкий спектр встроенных совпадений, вам может потребоваться создание пользовательских матчеров для конкретной логики. Пользовательские совпадения могут быть более дорогими вычислительными, если они связаны с сложной логикой или операциями. Это связано с тем, что они требуют реализации интерфейса `arcyrymatcher` и определения метода` matches () `, который может выполнять произвольные проверки.4. Проверка накладных расходов **
- Проверка с помощью сопоставщиков: При проверке взаимодействия с макетными объектами с использованием `revify ()`, Mockito также использует совпадения, чтобы проверить, были ли переданы правильные аргументы. Подобно заглушке, проверка с маттерами может ввести некоторые накладные расходы, особенно если вы проверяете несколько вызовов со сложными совпадами.5. Лучшие практики для производительности **
- Используйте специфичность с умом: используйте совпадения с правильным уровнем специфичности. Например, `anyint ()` менее специфичен и быстрее, чем `eq (4)`, но использование `eq (4)`, когда вам нужно проверить конкретное значение, является более точным и не влияет на производительность.- Избегайте ненужной сложности: избегайте использования пользовательских совпадений, если это необходимо. Если тест требует сложной логики для соответствия аргументам, рассмотрите возможность упрощения теста или творческого использования существующих совпадений.
- Профилируйте ваши тесты: если вы заметите проблемы с производительностью в своих тестах, профилируйте их, чтобы идентифицировать узкие места. Для матчеров Mockito редко станет основной причиной значительных проблем с производительностью, но всегда хорошо проверить.
Таким образом, в то время как матчеры аргументов Mockito вводят некоторые накладные расходы, это, как правило, не является серьезной проблемой, если вы не имеете дело с чрезвычайно сложными или критическими тестами. Преимущества использования маттера, такие как гибкость и ясность в коде тестирования, обычно перевешивают незначительные затраты на производительность.
Цитаты:[1] https://stackoverflow.com/questions/56559146/junit-using-eq-argument-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-te-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-directly-when-mockito-uni