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。当我注入它并设置为自定义配置时,事务仍然无法工作 有时需要刷新事务以显示值。有时需要刷新事务以显示值。