Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Sự khác biệt chính giữa Whitebox của Powermock và Whitebox của Mockito là gì


Sự khác biệt chính giữa Whitebox của Powermock và Whitebox của Mockito là gì


Whitebox của PowerMock và Whitebox của Mockito đều là các lớp tiện ích được sử dụng để truy cập và điều khiển các trạng thái bên trong của các lớp, nhưng chúng có sự khác biệt rõ rệt về nguồn gốc, chức năng và bối cảnh sử dụng.

Nguồn gốc và tính khả dụng

- Whitebox của Mockito: Đây là một lớp nội bộ trong Mockito cho phép người dùng đặt trạng thái nội bộ của các đối tượng. Tuy nhiên, nó đã bị xóa khỏi Mockito 2.x do lo ngại về việc thúc đẩy các hoạt động thử nghiệm xấu và vì nó không dành cho sử dụng công cộng [11]. Người dùng dựa vào nó được khuyến khích chuyển sang các lựa chọn thay thế như Whitebox của PowerMock hoặc thực hiện các tiện ích phản xạ của riêng họ [3].

- Whitebox của PowerMock: Đây là một phần của Thư viện PowerMock, mở rộng khả năng của Mockito bằng cách cho phép chế giễu các phương pháp riêng, tĩnh và cuối cùng, trong số các tính năng khác [5]. Whitebox của PowerMock cung cấp một tiện ích phản xạ đơn giản hóa dành cho các thử nghiệm, cho phép truy cập vào các thành viên tư nhân và gọi các phương thức riêng tư [2] [6].

Chức năng

- Whitebox của Mockito (lịch sử): Trước khi loại bỏ, WhiteBox của Mockito cho phép người dùng đặt trạng thái nội bộ của các đối tượng bằng các phương thức như `setInternalState`. Điều này rất hữu ích cho việc đưa giả vào các lớp mà không có setters công khai.

- Whitebox của PowerMock: cung cấp một bộ chức năng rộng hơn, bao gồm:
- Truy cập các thành viên tư nhân: Các phương thức như 'getInalalState` cho phép truy xuất các giá trị trường riêng.
- Gọi các phương thức riêng tư: Phương thức `invokemethod` có thể gọi các phương thức riêng tư, bao gồm các phương thức tĩnh [4] [10].
- Đặt các trường riêng: Mặc dù không được ghi lại rõ ràng, Whitebox của PowerMock có thể được sử dụng để đặt các trường riêng thông qua phản xạ, mặc dù đây không phải là mục đích chính của nó.

Bối cảnh sử dụng

- Whitebox của Mockito: Vì nó không còn có sẵn trong Mockito 2.x, người dùng nên sử dụng các lựa chọn thay thế như Whitebock của PowerMock hoặc 'ReflectionTestutUtils` của Spring nếu có [1] [3].

- Whitebox của PowerMock: Thường được sử dụng trong các kịch bản trong đó truy cập trực tiếp vào các thành viên hoặc phương thức riêng là cần thiết, thường là trong mã di sản hoặc khi kiểm tra logic phức tạp không thể dễ dàng tái cấu trúc. Tuy nhiên, thường nên tránh sử dụng các tiện ích như vậy trừ khi thực sự cần thiết, vì chúng có thể bỏ qua đóng gói và dẫn đến các thử nghiệm giòn [10].

Tóm lại, trong khi cả hai tiện ích Whitebox đều phục vụ các mục đích tương tự, phiên bản của PowerMock toàn diện và có sẵn rộng rãi hơn, trong khi phiên bản của Mockito đã bị loại bỏ do lo ngại về thực hành thử nghiệm. Whitebox của PowerMock là một công cụ mạnh mẽ để truy cập và điều khiển các trạng thái lớp nội bộ nhưng nên được sử dụng một cách thận trọng.

Trích dẫn:
[1] https://stackoverflow.com/questions/40280918/what-do-i-use-instead-of-whitebox-in-mockito-2-2-to-set-fields
[2] https://www.javadoc.io/doc/org.powermock/powermock-reflect/1.6.5/org/powermock/reflect/Whitebox.html
[3] https://proandroiddev.com/mockito-2-x-over-powermock-migration-tips-and-tricks-top-ten-118c52abd1d8
[4] https://johnmullins.co
[5] https://www.calsoftinc.com/blogs/unit-testing-mockito-powermockito.html
[6] https://www.javadoc.io/doc/org.powermock/powermock-reflect/latest/org/powermock/reflect/Whitebox.html
[7] https://github.com/mockito/mockito/issues/422
[8] https://www.alibabacloud.com/blog/598057
[9] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.powermock.reflect.Whitebox
[10] https://github.com/powermock/powermock/wiki/Bypass-Encapsulation
[11] https://github.com/mockito/mockito/issues/489
.