Đặt lại các chế độ giả trong Mockito là một tính năng cho phép bạn sử dụng lại các đối tượng giả bằng cách xóa các tương tác và sơ khai của chúng. Tuy nhiên, sử dụng `reset ()` thường không được khuyến khích trừ khi thực sự cần thiết, vì nó có thể chỉ ra các thử nghiệm có cấu trúc kém. Dưới đây là một số thực tiễn tốt nhất để đặt lại Mocks trong Mockito:
Hiểu khi nào nên sử dụng `reset ()`
-Tránh sử dụng `reset ()`: Lý do chính `reset ()` tồn tại là để hỗ trợ các giả được tiêm container, chẳng hạn như những giả sử được sử dụng trong mã di sản hoặc giao diện bên thứ ba. Trong hầu hết các trường hợp, đặc biệt là với mã điều khiển thử nghiệm được thiết kế tốt, bạn nên tránh sử dụng `reset ()` và thay vào đó tập trung vào việc tạo các phương pháp kiểm tra nhỏ, tập trung [2] [4].
- Mùi mã: Nếu bạn thấy mình cần sử dụng `reset ()` trong một phương thức kiểm tra, thì đó có thể là dấu hiệu cho thấy các bài kiểm tra của bạn quá phức tạp hoặc bao gồm quá nhiều kịch bản. Điều này có thể cho thấy nhu cầu tái cấu trúc các bài kiểm tra của bạn hoặc mã được kiểm tra [2].
Các lựa chọn thay thế cho `reset ()`
- Tạo giả mới: Thay vì đặt lại giả, hãy xem xét việc tạo các phiên bản giả mới cho mỗi phương thức kiểm tra. Cách tiếp cận này đảm bảo rằng mỗi thử nghiệm bắt đầu bằng một bảng xếp hạng sạch, làm giảm nguy cơ tương tác từ các thử nghiệm trước đây ảnh hưởng đến hiện tại [4].
- Sử dụng `ClearInvocations ()`: Nếu bạn chỉ cần xóa lịch sử gọi (ví dụ: để xác minh các tương tác mà không ảnh hưởng đến việc khai thác), hãy sử dụng `mockito.clearinvocations ()`. Phương pháp này loại bỏ lịch sử gọi mà không cần đặt lại các cuống, có thể hữu ích trong một số kịch bản nhất định [4].
Thực tiễn tốt nhất để đặt lại giả
- Đặt lại sau mỗi lần kiểm tra: Nếu bạn phải đặt lại giả, hãy làm như vậy sau mỗi phương thức kiểm tra bằng cách sử dụng chú thích `@sau` sau 'trong JUnit hoặc `Aftereach ()` trong Scalatest. Điều này đảm bảo rằng mỗi thử nghiệm bắt đầu với trạng thái giả sạch [3] [10].
- Tránh đặt lại trước các bài kiểm tra: Đặt lại giả trước mỗi lần kiểm tra có thể dẫn đến sự nhầm lẫn về trạng thái mà giả khi bắt đầu thử nghiệm. Nói chung, rõ ràng hơn để tạo giả hoặc đặt lại sau các bài kiểm tra [10].
- Sử dụng các tính năng khung: Trong các khung như Spring, sử dụng các chú thích như `@mockbean` có thể tự động xử lý việc đặt lại giả sau mỗi lần kiểm tra, loại bỏ nhu cầu đặt lại thủ công [10].
Phần kết luận
Mặc dù Mockito cung cấp phương thức `reset ()` cho các trường hợp sử dụng cụ thể, nhưng thường nên tránh việc sử dụng nó có lợi cho thiết kế thử nghiệm tập trung hơn, tập trung hơn. Bằng cách tạo các chế độ giả mới cho mỗi thử nghiệm hoặc sử dụng các tính năng khung để quản lý trạng thái giả, bạn có thể đảm bảo các thử nghiệm mạnh mẽ và có thể duy trì mà không cần thiết lập lại thủ công.
Trích dẫn:[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-appropriate-use-of-mockitos-reset-method
[5] https://github.com/mockito/mockito-kotlin/issues/513
[6] https://symflower.com/en/company/blog/2024/how-to-do-cirm
[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