6.1 Chế nhạo phương thức tĩnh mockStatic()

Và một điểm quan trọng nữa là chế nhạo và xác minh các phương thức tĩnh. “Có chuyện gì thế?” bạn hỏi. Có, tĩnh, nhưng các phương pháp là như nhau. Và bạn sẽ sai.

Hãy nhớ nơi chúng ta bắt đầu tìm hiểu về các đối tượng giả? Vì các đối tượng này được tạo một cách giả tạo thông qua DynamicProxy. Và các phương thức tĩnh không bị ràng buộc với bất kỳ đối tượng nào và DynamicProxykhông thể chặn các cuộc gọi đến chúng thông qua . Đó là tất cả.

Nhưng những người tạo ra Mockito cũng có thể tránh được ở đây - họ đã viết trình nạp lớp của riêng mình và với sự trợ giúp của nó, họ có thể thay thế các lớp một cách nhanh chóng. Một công việc lớn và khó khăn, nhưng họ vẫn làm được.

Bạn sẽ cần thêm một thư viện bổ sung vào pom.xml:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.2.0</version>
    <scope>test</scope>
</dependency>

Đây là cách hoạt động nếu bạn cần thử một phương thức tĩnh.

1 Tạo một đối tượng lớp giả đặc biệt:

MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);

2 Thêm quy tắc hoạt động cho đối tượng này:

Cần phải bám vào đối tượng của quy tắc này theo những cách khác.

managerObject.when(ClassName::method name).thenReturn(result);

3 Đảm bảo bao bọc việc sử dụng đối tượng nàytry-with-resources để đối tượng bị xóa ngay lập tức và Mockito có thể xóa các quy tắc liên quan đến đối tượng đó.

Ví dụ:

@Test
void givenStaticMethodWithNoArgs () {
    try (MockedStatic< StaticUtils> utilities =  Mockito.mockStatic( StaticUtils.class)) {
        // add rule
         utilities.when(StaticUtils::name).thenReturn("Hello");

        // check if the rule works
        assertEquals("Hello", StaticUtils.name());
    }
}

Không đẹp bằng chú thích @Mock@Spy, nhưng rất thực tế. Rất khó để viết các bài kiểm tra khi không thể mô phỏng một phương thức tĩnh đơn giản được sử dụng bên trong các phương thức được kiểm tra.