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
相关产品推荐
相关产品推荐

