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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:15:31