Spring Boot内置Mockito在OpenJDK 11环境下无法附着JVM问题求解
根因分析
- 你使用的Mockito 3.9.0内置的Byte Buddy 1.10.x版本未适配Apple M1芯片架构下的JVM自附着逻辑,默认会尝试启动外部进程完成代理挂载
- macOS 12对进程间调试挂载权限做了更严格的限制,即便配置了防火墙、JVM附着参数,外部进程的挂载请求依然会被系统安全机制拦截
- 你之前添加的
-Djdk.attach.allowAttachSelf=true参数未生效,是因为旧版本Byte Buddy不会优先使用JVM内部自附着能力,依然会走外部进程挂载逻辑
解决方案
方案1:升级Byte Buddy依赖(优先推荐,无功能损失)
在项目pom.xml的dependencyManagement节点中手动指定更高版本的Byte Buddy,兼容现有Spring Boot和Mockito版本,无需修改其他代码:
<dependencyManagement> <dependencies> <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy</artifactId> <version>1.12.18</version> </dependency> <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy-agent</artifactId> <version>1.12.18</version> </dependency> </dependencies> </dependencyManagement>
升级后保留之前添加的-Djdk.attach.allowAttachSelf=true参数即可正常运行测试。
方案2:更换Mockito MockMaker实现(无需改依赖,有功能限制)
如果你的单元测试没有mock final类、静态方法、私有方法的需求,可以切换Mockito的mock实现来规避Byte Buddy的挂载问题:
在src/test/resources目录下创建路径META-INF/mockito-extensions,新建文件org.mockito.plugins.MockMaker,写入以下内容:
mock-maker-subclass
该方案不需要修改任何依赖,适配所有JDK版本,缺点是不支持inline mock maker的高级特性。
方案3:修复macOS权限配置
如果上述方案都未生效,检查系统权限配置:
- 打开「系统设置 > 隐私与安全性 > 开发者工具」
- 勾选你运行测试所用的终端(Terminal/iTerm2等)、IDE(IntelliJ IDEA等)的权限
- 重启终端/IDE后重新运行测试
内容的提问来源于stack exchange,提问作者quiram
相关产品推荐
相关产品推荐

