Spring启动集成测试回滚不起作用

时间:2017-12-26 11:13:46

标签: java spring spring-boot transactions integration-testing

在春季启动时,我正在尝试创建我的第一个事务测试,但是trasaction不起作用。

@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. 测试后我仍然拥有数据库中的数据,事务中没有回滚。
  4. 我不确定他们是否在同一笔交易中运行。是否可以在getFullList()方法运行之前将数据提交给数据库?

    我需要什么:

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

1 个答案:

答案 0 :(得分:1)

来自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

<强>更新

@SqlConfig移除@Sql

config = @SqlConfig(transactionMode = ISOLATED)

或改为:

config = @SqlConfig(transactionMode = TransactionMode.INFERRED)

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

  

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

     

表示SQL脚本应始终以新的方式执行,   将立即提交的孤立交易。