Анотації@@generatemocks` і `@eneneratenicemocks` в Mockito використовуються для створення макетних класів для тестування одиниць у програмах DART та Flutter. Незважаючи на те, що обидві анотації служать одній і тій же основній меті, вони суттєво відрізняються своєю поведінкою, коли обробляються нестабільними викликами методу.
@generatemocks
- Поведінка методів, що не належать,: Коли метод називається макетним об’єктом, створеним за допомогою `@generatemocks`, і для цього методу не було визначено жодної заглушки, Mockito кине виняток. Така поведінка гарантує, що ви чітко визначаєте заглушки для всіх методів, які, як очікується, будуть викликані під час тесту, що допомагає зловити потенційні нагляди в налаштуванні тестів.
- Використання: Ця анотація зазвичай використовується, коли ви хочете суворий контроль над поведінкою ваших макетів, гарантуючи, що будь -які несподівані дзвінки методу негайно позначають як помилки.
- Статус зневаги: `@generateMocks` вважається менш рекомендованим порівняно з`@generatenicemocks` через його сувору поведінку, що може призвести до більш досконалого тестового коду, якщо не керується ретельно.
@generatenicemocks
- Поведінка для нестабільних методів: Навпаки, макети, створені з `@generatenicemocks`, повернуть за замовчуванням, юридичне значення для типу повернення методу, коли викликається метод, що не містить. Це значення за замовчуванням не призначене для використання в логіці тестування, але служить для запобігання помилок часу виконання через нульові або відсутні значення.
- Використання: Ця анотація рекомендується для більшості випадків використання, оскільки це спрощує тестування, зменшуючи необхідність заглушити кожен можливий виклик методу. Це робить тести більш надійними, уникаючи невдач через забуті заглушки.
- Додаткові функції: `@generateneCemocks` дозволяє лише` MockSpec's's у своєму списку аргументів, забезпечуючи більшу гнучкість у налаштуванні створених макетних класів. Наприклад, ви можете вказати власну назву для класу Mock, використовуючи параметр `як` в` mockspec`.
Ключові відмінності
1. Поводження з неуперерованими методами: Найважливіша різниця полягає в тому, як кожен метод Annotation обробляє метод без явних заглушок. `@GenerateMocks` кидає виняток, а`@generatenicemocks` повертає значення за замовчуванням.
2. Простота та надійність коду: `@generateneCemocks", як правило, призводить до більш простих і надійних тестових кодів за рахунок зменшення потреби у вичерпній заглушуванні.
3. Налаштування: `@generatenicemocks` пропонує більше варіантів налаштування через` mockspec`, що дозволяє отримати власні імена макетних класів та інші вдосконалені конфігурації.
Підсумовуючи, `@generateneCemocks", як правило, віддається перевагу за його здатність спростити тестовий код та зменшити помилки внаслідок нестабільних методів, тоді як `@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-generated-mock-class
[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-class-which-apears-to-Already-be-mocked
[11] https://pub.dev/packages/mockito