@Sql 注释脚本执行,但测试期间数据不可见

Posted

技术标签:

【中文标题】@Sql 注释脚本执行,但测试期间数据不可见【英文标题】:@Sql annotation script executes but data not visible during test 【发布时间】:2022-01-20 00:38:02 【问题描述】:

我有一个 Spring Boot 测试,我在测试方法中添加了 @Sql("some-script.sql")@Transactional 注释,并且我希望脚本中的数据填充到内存数据库中的 H2 中,但是在检查,它不是,所以我的测试失败了。我可以确认我没有硬编码的提交语句,并且 SQL 脚本正在按照 spring 数据源 ScriptUtils 类中的日志行执行。

我期望的行为是,对于每个测试方法,我都有一个单独的 SQL 脚本,我正在执行该脚本来填充数据,验证被测类的某些行为,然后回滚在测试方法完成后的脚本。我不希望测试方法完成后测试数据存在于内存数据库中,并且我不想为每个测试方法重新加载 spring 上下文,所以我认为有一种方法可以通过事务使这成为可能,但我没有取得太大的成功。有谁知道如何使我所呼吁的行为起作用?

【问题讨论】:

【参考方案1】:

@Sql 注解提供了一个配置选项来设置事务模式:config = @SqlConfig(transactionMode = TransactionMode.INFERRED。 但是,默认值inferred 通常会使 SQL 在由TransactionalTestExecutionListener 之前打开的现有事务中执行(这是使用AbstractTestContextBootstrapper 为每个春季测试设置的标准侦听器的一部分,例如@DataJpaTest,或@SpringBootTest)。 如果是这种情况,则插入的值应该存在于事务中。

请注意,自己声明的 @BeforeEach 方法是在事务打开和 @Sql 脚本运行后执行的,所以要小心,例如在@BeforeEach 中实现数据库清理行为时,因为这也会清理新插入的数据。

【讨论】:

以上是关于@Sql 注释脚本执行,但测试期间数据不可见的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot - h2 DB 测试多次执行脚本

MySql SQL 脚本的可移植性,MySql 可以执行的注释代码

MySql SQL 脚本的可移植性,MySql 可以执行的注释代码

MySql SQL 脚本的可移植性,MySql 可以执行的注释代码

MySql SQL 脚本的可移植性,MySql 可以执行的注释代码

sql脚本期间的提示