繁体   English   中英

Spring boot 集成测试回滚不起作用

[英]Spring boot integration test rollback does not work

在 Spring Boot 中,我试图创建我的第一个事务测试,但事务不起作用。

@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 文件执行良好并插入到数据库中。
  2. getFullList()方法可以读取它并返回正确的数据。
  3. 测试后我的数据库里还有数据,事务没有回滚。

我不确定它们是否在同一个事务中运行。 是否有可能在getFullList()方法运行之前将数据提交到数据库?

我需要的:

  1. @Sql向事务中插入数据。
  2. getFullList()从事务中读取数据。
  3. 测试返回的数据。
  4. 回滚事务。

来自Spring 测试 - 使用 @Sql 以声明方式执行 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 
}

相关问题: 如何在@Before 方法之前执行@Sql

更新

删除@SqlConfig@Sql

config = @SqlConfig(transactionMode = ISOLATED)

或更改为:

config = @SqlConfig(transactionMode = TransactionMode.INFERRED)

SQL 脚本在不回滚的单独事务中运行:

org.springframework.test.context.jdbc.SqlConfig.TransactionMode.ISOLATED

指示 SQL 脚本应始终在将立即提交的新的、隔离的事务中执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM