You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java Mockito测试方法内部调用的其他方法

使用Mockito验证方法内部调用Collections.reverse的方案

首先要注意:Collections是JDK提供的静态工具类,要Mock它的静态方法需要使用Mockito 3.4.0及以上版本,并且引入mockito-inline依赖(用于支持静态方法Mock能力)。


步骤1:引入必要依赖

如果是Maven项目,在pom.xml中添加如下依赖:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.11.0</version> <!-- 可替换为最新稳定版 -->
    <scope>test</scope>
</dependency>

步骤2:编写测试用例

使用Mockito提供的MockedStatic来创建静态类的Mock上下文,在作用域内验证静态方法的调用:

import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import static org.mockito.Mockito.*;
import java.util.Collections;
import java.util.List;

public class TaskReadServiceTest {

    private final TaskRepository mockRepository = mock(TaskRepository.class);
    private final TaskReadService taskReadService = new TaskReadService(mockRepository);

    @Test
    public void testReadAllOrderedShouldCallReverse() {
        // 1. 构造模拟返回的任务列表
        List<Task> mockTasks = List.of(new Task(), new Task());
        when(mockRepository.readAll()).thenReturn(mockTasks);

        // 2. 开启Collections静态类的Mock上下文,try-with-resources会自动关闭上下文,避免影响其他测试
        try (MockedStatic<Collections> mockedCollections = mockStatic(Collections.class)) {
            // 3. 调用待测试的业务方法
            taskReadService.readAllOrdered(TasksListOrder.BY_PRIORITY);
            
            // 4. 验证Collections.reverse被调用1次,且参数就是repository返回的列表
            mockedCollections.verify(() -> Collections.reverse(mockTasks), times(1));
        }
    }
}

更推荐的替代方案(无需Mock静态方法)

单元测试更建议验证行为结果而非具体实现调用,你可以直接验证返回的列表是否是排序后反转的结果,不需要MockCollections.reverse:

  • 构造包含明确顺序的测试Task列表,让repository返回该列表
  • 调用readAllOrdered方法拿到返回结果
  • 直接断言返回列表的顺序和预期反转后的顺序一致即可,这种方式更稳定,不会因为实现修改(比如把reverse逻辑换成手动反转)就导致测试失效。

内容的提问来源于stack exchange,提问作者Sampeteq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:45:04