TestNG+Mockito-inline调试时被测方法断点无法命中问题求助
问题根因
Mockito-inline 基于 Byte Buddy 实现运行时字节码增强来支持静态方法mock,字节码修改过程中默认会剥离部分调试信息,同时你使用的2018-12版本Eclipse对动态增强后的字节码行号映射识别存在兼容性缺陷,两者共同导致业务代码断点无法命中、单步高亮错位。
可用解决方案
1. 新增Mockito-inline调试配置
在项目src/test/resources目录下创建mockito-extensions文件夹,新增文件org.mockito.configuration.MockitoConfiguration,添加如下配置:
# 启用完整调试信息生成 mockito.debug.enabled = true mockito.bytebuddy.debug.enabled = true # 强制保留字节码与原源码的行号映射 mockito.inline.preserveLineNumbers = true mockito.inline.clearAllAdviceOnExit = true
配置后重新构建项目,使Mockito加载新的配置规则。
2. 调整Eclipse调试设置
打开窗口 > 首选项 > Java > 调试,勾选以下两个选项:
- 允许行号断点存在于未编译到类文件中的行
- 暂停执行时高亮显示源代码行
同时打开对应测试用例的调试配置,在源标签页确认业务代码项目已被添加到源码查找路径中,避免Eclipse无法匹配源码和运行的字节码。
3. 新增测试JVM启动参数
在测试用例的调试配置中,添加如下JVM参数:
-Dsun.reflect.inflationThreshold=0 -Djdk.attach.allowAttachSelf=true -Dorg.mockito.internal.debugging.Enabled=true
禁用反射优化机制,确保Mockito字节码代理可以完整附着到当前JVM进程,避免部分字节码增强不完整导致的调试信息丢失。
4. 版本兼容修复
如果上述配置仍无法解决问题,可将Eclipse升级至2020-06及以上版本,该版本及后续版本已修复动态字节码增强场景下的调试行号映射问题,无需额外配置即可适配Mockito-inline的调试场景。
5. 临时调试替代方案
调试时可在测试代码调用myService.myMethodUnderTest()的行号处打断点,命中断点后按F5步进进入被测方法,就算出现高亮错位的情况,也可以通过变量面板的数值变化确认当前执行的代码逻辑,满足临时调试需求。
内容的提问来源于stack exchange,提问作者Son Nguyen
相关产品推荐
相关产品推荐

