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

JUnit5使用PER_CLASS实例模式时@Sql注解无法执行SQL脚本如何解决

问题产生原因

  • Spring 提供的@Sql注解默认执行阶段为ExecutionPhase.BEFORE_TEST_METHOD,仅会在每个测试方法执行前触发运行,不会在测试类初始化阶段执行。
  • 当你使用@TestInstance(TestInstance.Lifecycle.PER_CLASS)模式时,非静态的@BeforeAll方法会在所有测试方法执行前、Spring测试上下文初始化完成后就立即运行,此时类上标注的@Sql还未触发执行,你在setUp方法中查询数据库自然拿不到对应数据,会误以为@Sql没有生效。

修复方案

方案1:指定@Sql的执行阶段为测试类启动前

修改@Sql注解的配置,明确要求SQL在整个测试类所有动作执行前运行,即可保证@BeforeAll方法执行前SQL已经跑完:

// 增加executionPhase配置
@Sql(scripts = "/sql/sql-data.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class UserControllerTest extends ApplicationTests  {
    // 原有代码不变
}

该方案适配你当前单实例测试类的使用逻辑,SQL仅执行一次,所有测试方法共用初始化的数据,性能最优。

方案2:调整初始化方法的运行时机

如果你的测试用例需要每个方法都使用独立的干净数据,可以将setUp方法的注解从@BeforeAll改为@BeforeEach,此时@Sql会按照默认逻辑在每个测试方法前运行,setUp执行时就能正常拿到插入的数据。

方案3:手动执行SQL脚本

如果需要更高的灵活度,可以直接注入JdbcTemplate,在@BeforeAll方法中手动加载执行对应路径的SQL脚本。

内容的提问来源于stack exchange,提问作者skyho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:54:03