Аннотация `@generatemocks` и`@generatenicemocks` в Mockito используются для генерации макетных классов для модульных тестирования в приложениях DART и Flutter. В то время как обе аннотации служат одной и той же основной цели, они значительно различаются по своему поведению при обращении с нестабильными вызовами методов.
@generatemocks
- Поведение для нестабированных методов: когда метод вызывается на макетном объекте, сгенерированном с помощью `@generatemocks ', и для этого метода не было определено, что Mockito выставит исключение. Такое поведение гарантирует, что вы явно определяете заглушки для всех методов, которые, как ожидается, будут вызваны во время теста, помогая уладить потенциальные контроли в настройке тестов.
- Использование: эта аннотация обычно используется, когда вы хотите строгого контроля над поведением ваших макетов, гарантируя, что любые неожиданные вызовы метода немедленно помечались как ошибки.
- Статус искоренения: `@generatemocks` считается менее рекомендуемым по сравнению с`@generatenicemocks` из -за его строгого поведения, что может привести к большему тестовому коду, если не управляется тщательно.
@generatenicemocks
- Поведение для нестабированных методов. Напротив, макет, сгенерированные с помощью `@generatenicemocks`, возвращают дефолт, законное значение для типа возврата метода при вызове нестабированного метода. Это значение по умолчанию не предназначено для использования в логике теста, но служит для предотвращения ошибок времени выполнения из -за нулевых или отсутствующих значений.
- Использование: эта аннотация рекомендуется для большинства вариантов использования, потому что оно упрощает написание тестов, уменьшая необходимость загрязнить каждый возможный вызов метода. Это делает тесты более надежными, избегая сбоев из -за забытых заглушек.
- Дополнительные функции: `@generatenicemocks` только позволяет« Mockspec »в своем списке аргументов, обеспечивая большую гибкость в настройке сгенерированных макетных классов. Например, вы можете указать пользовательское имя для макетного класса, используя параметр `as` в` mockspec`.
Ключевые различия
1. Обработка нестабированных методов: наиболее значимым отличием является то, как каждая аннотация обрабатывает вызовы метода без явных заглушек. `@Generatemocks` бросает исключение, а`@generatenicemocks` возвращает значение по умолчанию.
2. Кодовая простота и надежность: `@generatenicemocks` обычно приводит к более простому и более надежному тестовому коду, уменьшая необходимость в исчерпывающем заглушке.
3. Настройка: `@generatenicemocks` предлагает больше параметров настройки через` mockspec`, позволяя получить пользовательские имена макетных классов и другие расширенные конфигурации.
Таким образом, `@generatenicemocks`, как правило, предпочтительнее, чтобы ее способность упростить тестовый код и уменьшать ошибки из -за нестабированных методов, в то время как`@generatemocks` обеспечивает более строгий подход, который может быть полезен в конкретных сценариях, когда требуется явный контроль над макетным поведением [1] [4] [11].
Цитаты:[1] https://www.amaysim.technology/blog/flutter-test-mockito-generatemocks vs-generatenicemocks
[2] https://www.reddit.com/r/golang/comments/ua0hps/generated_vs_handwritten_mocks/
[3] https://blog.logrocket.com/unit-testing-flutter-code-mockito/
[4] https://pub.dev/documentation/mockito/latest/annotations/generatenicemocks-class.html
[5] https://plugins.jetbrains.com/plugin/23513 Generate-flutter-mocks
[6] https://stackoverflow.com/questions/72390220/flutter-generatemocks-is-not, сгенерированный класс
[7] https://github.com/dart-lang/mockito/blob/master/null_safety_readme.md
[8] https://github.com/dart-lang/mockito/issues/367
[9] https://github.com/dart-lang/mockito/issues/422
[10] https://stackoverflow.com/questions/74406977/the-generatemocks-annotation-contains-a-class-which-appers-to-already-be-mocked
[11] https://pub.dev/packages/mockito