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

Mockito获取所有模拟对象:2.8版本移除监听后的替代方案

在Mockito 2.8+中收集所有已创建模拟对象的替代方案

在Mockito 2.8及之后的版本里,旧版的MockingProgress监听器机制被官方重构移除了,不过我们可以通过MockitoSession + 自定义MockingListener的组合来实现收集所有已创建模拟对象的需求,这也是官方推荐的合规方案。

方案一:使用MockitoSession和自定义MockingListener(推荐)

这个方案基于Mockito的公开API,兼容性和稳定性都有保障,步骤如下:

1. 实现自定义的MockingListener

创建一个监听器类,在模拟对象被创建时自动收集实例:

import org.mockito.MockingDetails;
import org.mockito.listeners.MockingListener;
import java.util.ArrayList;
import java.util.List;

public class CollectCreatedMocksListener implements MockingListener {
    private final List<Object> createdMocks = new ArrayList<>();

    @Override
    public void onMockCreated(Object mock, MockingDetails mockingDetails) {
        // 每次创建mock时,将实例加入集合
        createdMocks.add(mock);
    }

    // 对外提供获取已收集mock的方法
    public List<Object> getCreatedMocks() {
        return createdMocks;
    }
}

2. 用MockitoSession启用监听器

在你的测试或代码逻辑中,通过MockitoSession注册这个监听器,所有在session生命周期内创建的mock都会被收集:

import org.mockito.Mockito;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;

public class MockCollectionDemo {
    public static void main(String[] args) {
        CollectCreatedMocksListener mockCollector = new CollectCreatedMocksListener();

        // 启动MockitoSession并绑定监听器
        try (MockitoSession session = Mockito.mockitoSession()
                .strictness(Strictness.LENIENT) // 根据需求设置严格程度
                .addMockingListener(mockCollector)
                .startMocking()) {

            // 在这里创建你的模拟对象
            List<String> mockList = Mockito.mock(List.class);
            Runnable mockRunnable = Mockito.mock(Runnable.class);
            // ... 创建更多mock

            // 获取所有已创建的模拟对象
            List<Object> allCreatedMocks = mockCollector.getCreatedMocks();
            System.out.println("已创建的mock数量:" + allCreatedMocks.size()); // 输出2
        }
    }
}

如果是在JUnit测试中使用,你可以结合MockitoExtension(JUnit 5)或MockitoJUnitRunner(JUnit 4),通过MockitoSession来集成这个监听器,确保整个测试过程中创建的mock都被收集。

方案二:使用内部API(不推荐)

如果你需要获取全局范围内所有已创建的mock(不受session限制),可以通过Mockito的内部API实现,但要注意:内部API没有兼容性保证,后续版本可能会变动,谨慎使用。

import org.mockito.internal.progress.ThreadSafeMockingProgress;
import java.util.List;

public class GlobalMockCollector {
    public static List<Object> getAllGlobalCreatedMocks() {
        ThreadSafeMockingProgress mockingProgress = new ThreadSafeMockingProgress();
        return mockingProgress.getCreatedMocks();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:52:38