Mock phương thức static trong Unit Test sử dụng PowerMock

Trong bài viết này, mình sẽ hướng dẫn các bạn Mock các phương thức static trong Unit Test các bạn nhé!

Nếu bạn nào chưa biết về Mock trong Unit Test thì mình có thể nói sơ qua như thế này: Mock là giải pháp giúp chúng ta tạo ra một đối tượng giả để chúng ta có thể chỉ định hành vi của một đối tượng nào đó trong Unit Test. Ví dụ như, bạn có một đối tượng kết nối tới SFTP server nhưng trong Unit Test bạn không thể thiết lập một SFTP server thực được, do đó không thể test hàm kết nối của đối tượng này tới SFTP server được. Trong trường hợp này, bạn có thể tạo một đối tượng Mock để giả lập hành vi của đối tượng kết nối tới SFTP server và chỉ định khi đối tượng khác gọi tới hàm kết nối SFTP server của đối tượng này thì đối tượng này sẽ trả về giá trị gì.

Tại sao chúng ta phải sử dụng PowerMock để Mock các phương thức static? Đơn giản là bởi vì chỉ có PowerMock mới hỗ trợ cho chúng ta làm điều này.

OK, bây giờ chúng ta đi vào chủ đề chính của bài viết này nhé các bạn!

Mình sẽ tạo một project Maven để làm ví dụ cho các bạn dễ hiểu. Project của mình như sau:

Mock phương thức static trong Unit Test sử dụng PowerMock

Bây giờ chúng ta sẽ thêm dependency cần thiết của JUnitPowerMock vào project của chúng ta nhé các bạn! Các bạn hãy mở tập tin pom.xml và thêm những dependency sau:

Và class có chứa phương thức static mà chúng ta cần Mock sẽ có nội dung như sau:

Mock phương thức static trong Unit Test sử dụng PowerMock

Mục đích của class này là sử dụng Java để thực thi một command line kiểm tra sự tồn tại của một tập tin ở một máy tính khác sử dụng SSH mà không cần phải sử dụng user và password để đăng nhập (để chạy một chương trình sử dụng class này, chúng ta phải cài đặt việc đăng nhập tới máy khác không cần user với password trước).

Các bạn có thể thấy, trong class này, mình đã sử dụng đối tượng Runtime với phương thức static là getRuntime() để thực thi một command line trong Java. Trong Unit Test, làm sao mà chúng ta có thể simulate một máy tính khác để test phương thức static checkFileExistingWithoutUsernamePassword trong class SSHCommandLineHelper phải không các bạn? Giải pháp của chúng ta chỉ có thể là dùng Mock mà thôi.

Đầu tiên, các bạn hãy tạo một class SSHCommandLineHelperTest nằm trong thư mục test với package là com.huongdanjava.mockstatic như sau:

Mock phương thức static trong Unit Test sử dụng PowerMock

Trong class này, đầu tiên các bạn hãy khai báo annotation @PrepareForTest@RunWith trước như sau:

Trong phần @Before của Unit Test, chúng ta sẽ khai báo sử dụng PowerMock để Mock phương thức static trong class Runtime như sau:

Bây giờ, chúng ta sẽ viết test cho trường hợp khi chúng ta chạy chương trình để kiểm tra tập tin tồn tại trên một máy SSH khác thì phương thức checkFileExistingWithoutUsernamePassword trả về giá trị TRUE nhé các bạn!

Nội dung của phương thức testCheckFileExistingSuccessWithoutUsernamePassword như sau:

Kết quả:

Mock phương thức static trong Unit Test sử dụng PowerMock

Trường hợp chúng ta test cho tập tin không tồn tại thì chỉ cần chỉnh sửa một xíu như sau:

Kết quả:

Mock phương thức static trong Unit Test sử dụng PowerMock

Toàn bộ code của class SSHCommandLineHelperTest như sau:

3 thoughts on “Mock phương thức static trong Unit Test sử dụng PowerMock

Add Comment