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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:46:20