@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 注释脚本执行,但测试期间数据不可见的主要内容,如果未能解决你的问题,请参考以下文章
MySql SQL 脚本的可移植性,MySql 可以执行的注释代码
MySql SQL 脚本的可移植性,MySql 可以执行的注释代码
MySql SQL 脚本的可移植性,MySql 可以执行的注释代码