Spring启动集成测试回滚不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring启动集成测试回滚不起作用相关的知识,希望对你有一定的参考价值。
在春季启动时,我正在尝试创建我的第一个事务测试,但事务不起作用。
@TestPropertySource(locations = "classpath:test.properties")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringJUnit4ClassRunner.class)
//@RunWith(SpringRunner.class)
@Transactional
@TestExecutionListeners(
mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS,
listeners = {TransactionalTestExecutionListener.class}
)
public class IntegrationTests
{
@Autowired
TemperatureLogRepository temperatureLogRepository;
@Test
@SqlGroup({
@Sql(
executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD,
config = @SqlConfig(transactionMode = ISOLATED),
scripts = "classpath:sqls/insertRecords2.sql"
)
})
public void firstRepoTest() throws SQLException
{
assertThat(temperatureLogRepository.getFullList().size()).isEqualByComparingTo(0);
}
}
我知道SqlGroup不是必需的,但会添加更多文件。
我现在有:
- SQL文件执行良好并插入到DB中。
getFullList()
方法可以读取它并返回正确的数据。- 测试后我仍然在数据库中有数据,事务上没有回滚。
我不确定他们是否在同一笔交易中运行。在getFullList()
方法运行之前,是否可以将数据提交给db?
我需要的:
@Sql
将数据插入到交易中。getFullList()
从交易中读取数据。- 测试返回的数据。
- 回滚事务。
答案
来自Spring Testing - Executing SQL scripts declaratively with @Sql:
脚本执行阶段
默认情况下,SQL脚本将在相应的测试方法之前执行。但是,如果需要在测试方法之后执行一组特定的脚本 - 例如,为了清理数据库状态 - 可以使用@Sql中的executionPhase属性,如以下示例所示。请注意,ISOLATED和AFTER_TEST_METHOD分别从Sql.TransactionMode和Sql.ExecutionPhase静态导入。
@Test
@Sql(
scripts = "create-test-data.sql",
config = @SqlConfig(transactionMode = ISOLATED) ) @Sql(
scripts = "delete-test-data.sql",
config = @SqlConfig(transactionMode = ISOLATED),
executionPhase = AFTER_TEST_METHOD )
public void userTest {
// execute code that needs the test data to be committed
// to the database outside of the test's transaction
}
相关问题:How to execute @Sql before a @Before method
UPDATE
从@SqlConfig
中删除@Sql
:
config = @SqlConfig(transactionMode = ISOLATED)
或者改为:
config = @SqlConfig(transactionMode = TransactionMode.INFERRED)
SQL脚本在不支持roll的单独事务中运行:
org.springframework.test.context.jdbc.SqlConfig.TransactionMode.ISOLATED
表示应始终在将立即提交的新的隔离事务中执行SQL脚本。
以上是关于Spring启动集成测试回滚不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Spring @Transactional注解不回滚不起作用无效