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不是必需的,但会添加更多文件。

我现在有:

  1. SQL文件执行良好并插入到DB中。
  2. getFullList()方法可以读取它并返回正确的数据。
  3. 测试后我仍然在数据库中有数据,事务上没有回滚。

我不确定他们是否在同一笔交易中运行。在getFullList()方法运行之前,是否可以将数据提交给db?

我需要的:

  1. @Sql将数据插入到交易中。
  2. getFullList()从交易中读取数据。
  3. 测试返回的数据。
  4. 回滚事务。
答案

来自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注解不回滚不起作用无效

Mysqli回滚不起作用

@Transactional注解事务不回滚不起作用无效

PHP PDO事务回滚不起作用

第二个objects.create无法创建记录后Django回滚不起作用

iOS Coredata 回滚不起作用