Java Sql子句在集成测试结束前回滚

Java Sql子句在集成测试结束前回滚,java,spring,postgresql,spock,jooq,Java,Spring,Postgresql,Spock,Jooq,我有一个问题,经过两天的研究,我没能找到解决办法。到目前为止,我有一个简单的应用程序,只是从表中读取所有数据,并想为其编写一个集成测试 这是我的测试: @Transactional @SpringBootTest @ActiveProfiles("integrationTest") class StockFacadeIT extends Specification { @Autowired StockFacadeImpl stockFacade @Autowired

我有一个问题,经过两天的研究,我没能找到解决办法。到目前为止,我有一个简单的应用程序,只是从表中读取所有数据,并想为其编写一个集成测试

这是我的测试:

@Transactional
@SpringBootTest
@ActiveProfiles("integrationTest")
class StockFacadeIT extends Specification {

    @Autowired
    StockFacadeImpl stockFacade

    @Autowired
    DSLContext dslContext

    @Sql(scripts = "/add_sample_stocks.sql")
    def 'should return list of ticker in correct order'() {
        when:
        def tickers = stockFacade.loadAllTickers(dslContext)
        println "when cluase"

        then:
        println "then cluase"
        tickers.getAt(0) == 'abc'
        tickers.getAt(1) == 'gpw'
        tickers.getAt(2) == 'kgh'
        tickers.getAt(3) == 'tpe'
    }
}
在日志中,我看到:

2017-11-06 21:30:09.478  INFO 21124 --- [           main] o.s.t.c.transaction.TransactionContext   : Began transaction (1) for test context [DefaultTestContext@6a01e23 testClass = StockFacadeIT, testInstance = com.gpw.radar.stock.StockFacadeIT@455cbf18, testMethod = $spock_feature_0_0@StockFacadeIT, [...] rollback [true]
2017-11-06 21:30:09.478  INFO 21124 --- [           main] o.s.jdbc.datasource.init.ScriptUtils     : Executing SQL script from class path resource [add_sample_stocks.sql]
2017-11-06 21:30:09.478  INFO 21124 --- [           main] o.s.jdbc.datasource.init.ScriptUtils     : Executed SQL script from class path resource [add_sample_stocks.sql] in 0 ms.
2017-11-06 21:30:09.712  INFO 21124 --- [           main] org.jooq.Constants                       :
when cluase
then cluase
2017-11-06 21:30:09.869  INFO 21124 --- [           main] o.s.t.c.transaction.TransactionContext   : Rolled back transaction for test context [DefaultTestContext@6a01e23 testClass = StockFacadeIT, testInstance = com.gpw.radar.stock.StockFacadeIT@455cbf18, testMethod = $spock_feature_0_0@StockFacadeIT, testException = Condition not satisfied:

所以从日志的角度来看,我看到事务在测试之前开始,rolback在测试之后运行(“then子句”)。但由于数据库为空,测试无法通过。当我删除@Transactional注释时,它通过了,但插入的记录保留在DB中。我做错了什么?

我找到了问题所在。我在jooq之后添加了spring框架。我对jooq的最终配置如下所示:

@Bean
    @Profile("integrationTest")
    public DSLContext TestDslContext(DataSource dataSource) {
        return DSL.using(new DefaultConfiguration()
                .set(dataSource)
                .set(new Settings().withRenderNameStyle(RenderNameStyle.AS_IS))
                .set(SQLDialect.H2)
                .set(getRecordMapperProvider())
        );
    }

因此,当我删除此部分并使用spring boot的自动配置时,事务可以正常工作,但是,我已经检查了DSLContext配置在spring创建时的外观,因为缺少TransactionProvider和ExecuteListenerProvider。当我注入它并设置为自定义配置时,事务仍然无法工作

我找到了问题所在。我在jooq之后添加了spring框架。我对jooq的最终配置如下所示:

@Bean
    @Profile("integrationTest")
    public DSLContext TestDslContext(DataSource dataSource) {
        return DSL.using(new DefaultConfiguration()
                .set(dataSource)
                .set(new Settings().withRenderNameStyle(RenderNameStyle.AS_IS))
                .set(SQLDialect.H2)
                .set(getRecordMapperProvider())
        );
    }

因此,当我删除此部分并使用spring boot的自动配置时,事务可以正常工作,但是,我已经检查了DSLContext配置在spring创建时的外观,因为缺少TransactionProvider和ExecuteListenerProvider。当我注入它并设置为自定义配置时,事务仍然无法工作

有时需要刷新事务以显示值。有时需要刷新事务以显示值。