Mockito测试含内部Runnable的saveCompetence方法时无法进入run()的解决方法
解决Mockito单元测试中无法进入Runnable.run()方法的问题
核心原因
如果测试中对operationSupport做了Mock,默认情况下mode1方法不会执行真实逻辑,也就不会调用传入的Runnable.run(),导致调试无法进入该方法。
解决方案
1. 使用operationSupport的真实实例
如果operationSupport的依赖(比如sqlSessionFactory)可以在测试环境中初始化,直接使用真实对象而非Mock:
private OperationSupport operationSupport = new OperationSupport(/* 传入测试用的sqlSessionFactory */);
这样调用saveCompetence时,mode1会执行真实代码,触发Runnable.run(),调试即可进入。
2. 让Mock的operationSupport执行mode1的真实逻辑
如果必须MockoperationSupport,通过Mockito的doCallRealMethod()指定mode1方法执行真实逻辑:
@Mock private OperationSupport operationSupport; @BeforeEach void setup() { MockitoAnnotations.openMocks(this); // 配置mode1方法执行真实逻辑 doCallRealMethod().when(operationSupport).mode1(any(Runnable.class)); }
配置后,测试中调用saveCompetence时,mode1会执行真实代码,进而调用Runnable.run(),调试就能进入该方法。
3. 直接测试Runnable内部逻辑
如果仅需调试run()方法内的代码,可以把该逻辑抽成独立方法,或者直接在测试中创建Runnable并调用:
// 提取原Runnable内的逻辑为单独方法 private void executeCompetenceSave() { // 原run()方法内的代码 } // 测试时直接调用 @Test void testCompetenceSaveLogic() { executeCompetenceSave(); // 直接调试此方法 }
或者直接创建Runnable实例调用:
@Test void testRunnableLogic() { Runnable runnable = new Runnable() { @Override public void run() { // 原saveCompetence中的run逻辑 } }; runnable.run(); // 直接调用,调试进入 }
注意事项
- 确认断点位置:要在
run()方法内部的代码行设置断点,而非仅在new Runnable()处。 - 如果使用PowerMock等工具,检查是否存在拦截方法调用的配置,导致真实逻辑未执行。
内容的提问来源于stack exchange,提问作者alex_t
相关产品推荐
相关产品推荐

