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
相关产品推荐
相关产品推荐

