Spring Boot 3.x升级后JUnit测试启动卡住无法执行求助
Spring Boot 3.x + Java 17 下@SpringBootTest卡住的排查思路
确认JUnit版本适配:Spring Boot 3.x仅支持JUnit 5(Jupiter),需彻底排除JUnit 4相关依赖。检查
pom.xml,移除junit:junit或org.junit.vintage:junit-vintage-engine依赖,确保测试类使用org.junit.jupiter.api.Test注解,而非旧的org.junit.Test。简化测试类定位问题:先写一个极简测试类,仅保留
@SpringBootTest和空的@Test方法,看是否能正常执行。如果能,再逐步恢复原有测试的配置、依赖Bean,定位是哪个部分导致阻塞。排查Bean初始化阻塞:
- 调整日志级别为
DEBUG,查看启动日志最后停留在哪个Bean初始化阶段,定位可疑Bean。 - 使用
jps命令找到测试进程的PID,再执行jstack <PID>打印线程栈,查看处于WAITING/BLOCKED状态的线程,找到阻塞根源(比如数据库连接超时、Redis连接未响应、锁竞争等)。
- 调整日志级别为
检查依赖冲突与兼容性:
- 执行
mvn dependency:tree生成依赖树,排查是否存在Spring Framework版本不一致、或未适配Java 17的依赖(比如使用sun.*包、未支持模块化的旧库)。 - 重点检查第三方组件(如ORM框架、缓存客户端、消息队列客户端)是否有适配Java 17和Spring Boot 3的版本,及时升级这些依赖。
- 执行
调整JVM参数适配Java 17:Java 17加强了模块封装,若测试中用到反射操作内部API,需添加
--add-opens参数。比如在Maven Surefire插件中配置:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED</argLine> </configuration> </plugin>确认Surefire插件版本:确保使用适配Java 17的Surefire插件版本(建议3.0.0-M7及以上),旧版本可能无法正确处理Java 17的测试启动流程。在
pom.xml中明确指定插件版本:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> </plugin>
内容的提问来源于stack exchange,提问作者TimeBandit
相关产品推荐
相关产品推荐

