Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Sự khác biệt giữa @generatemocks và @generatenicemocks là gì


Sự khác biệt giữa @generatemocks và @generatenicemocks là gì


Các chú thích `@Generatemocks` và`@Generatenicemocks trong Mockito được sử dụng để tạo các lớp giả để thử nghiệm đơn vị trong các ứng dụng DART và Flutter. Mặc dù cả hai chú thích phục vụ cùng một mục đích chính, chúng khác nhau đáng kể trong hành vi của chúng khi xử lý các cuộc gọi phương thức không bị không bị ảnh hưởng.

@generatemocks

- Hành vi cho các phương thức không bị không bị hủy: Khi một phương thức được gọi trên một đối tượng giả được tạo bằng `@goteatemocks` và không có sơ khai nào được xác định cho phương pháp đó, Mockito sẽ ném một ngoại lệ. Hành vi này đảm bảo rằng bạn xác định rõ ràng các cuống cho tất cả các phương pháp dự kiến ​​sẽ được gọi trong một thử nghiệm, giúp nắm bắt các trọng lượng tiềm năng trong thiết lập thử nghiệm.

- Cách sử dụng: Chú thích này thường được sử dụng khi bạn muốn kiểm soát nghiêm ngặt hành vi giả của bạn, đảm bảo rằng mọi cuộc gọi phương thức bất ngờ đều được gắn cờ ngay lập tức là lỗi.

- Trạng thái phản đối: `@Generatemocks` được coi là ít được khuyến nghị so với`@Generatenicemocks` do hành vi nghiêm ngặt của nó, có thể dẫn đến mã kiểm tra dài dòng hơn nếu không được quản lý cẩn thận.

@generatenicemocks

- Hành vi đối với các phương thức không bị không bị ảnh hưởng: Ngược lại, chế giễu được tạo bằng `@Generatenicemocks` sẽ trả về một giá trị pháp lý, mặc định cho loại trả về của phương thức khi một phương thức không được gọi. Giá trị mặc định này không được sử dụng trong logic thử nghiệm nhưng phục vụ để ngăn chặn các lỗi thời gian chạy do giá trị null hoặc thiếu.

- Cách sử dụng: Chú thích này được khuyến nghị cho hầu hết các trường hợp sử dụng vì nó đơn giản hóa việc viết thử nghiệm bằng cách giảm nhu cầu ngăn chặn mọi cuộc gọi phương thức có thể. Nó làm cho các bài kiểm tra mạnh mẽ hơn bằng cách tránh những thất bại do các cuống bị lãng quên.

- Các tính năng bổ sung: `@Generatenicemocks` chỉ cho phép` mockspec `trong danh sách đối số của nó, cung cấp sự linh hoạt hơn trong việc tùy chỉnh các lớp giả được tạo. Ví dụ: bạn có thể chỉ định tên tùy chỉnh cho lớp giả bằng tham số `as` trong` mockspec`.

Sự khác biệt chính

1. Xử lý các phương pháp không bị không bị ảnh hưởng: Sự khác biệt đáng kể nhất là cách mỗi chú thích xử lý các cuộc gọi phương thức mà không có cuống rõ ràng. `@Generatemocks` ném một ngoại lệ, trong khi`@Generatenicemocks` trả về giá trị mặc định.

2. Mã đơn giản và mạnh mẽ: `@Generatenicemocks` thường dẫn đến mã kiểm tra đơn giản và mạnh mẽ hơn bằng cách giảm nhu cầu khai thác toàn diện.

3. Tùy chỉnh: `@Generatenicemocks` cung cấp nhiều tùy chọn tùy chỉnh hơn thông qua` mockspec`, cho phép các tên lớp giả tùy chỉnh và các cấu hình nâng cao khác.

Tóm lại, `@Generatenicemocks` thường được ưu tiên cho khả năng đơn giản hóa mã kiểm tra và giảm lỗi do các phương pháp không bị không bị ảnh hưởng, trong khi`@Generatemocks` cung cấp một cách tiếp cận chặt chẽ hơn có thể hữu ích trong các kịch bản cụ thể trong đó cần kiểm soát rõ ràng hành vi giả [1] [4] [11].

Trích dẫn:
[1] https://www.amaysim.technology/blog/flutter-test-mockito-generatemocks-vs-generatenicemocks
.
.
[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-a-class-which-appears-to-already-be-mocked
[11] https://pub.dev/packages/mockito