【发布时间】:2015-06-17 11:20:02
【问题描述】:
我无法将其设置为工作。基本上我希望当测试完成运行时数据库处于与以前完全相同的状态。当使用 Spring/Hibernate 托管会话和连接时会发生这种情况,但对于 DBUnit 则不会。我已经尝试了很多事情,此时我正在做一些事情,比如将共享数据源包装在 TransactionAwareDataSourceProxy 中并手动执行加载数据集,而不是使用 @DatabaseSetup。
this.databaseConnection = new DatabaseConnection(dataSource.getConnection());
IDataSet xmlFileDataSet = new FlatXmlDataSetBuilder().build(getClass().getResourceAsStream("/dataset.xml"));
DatabaseOperation.REFRESH.execute(databaseConnection, xmlFileDataSet);
而且它根本不起作用。我检查了 dataSource 对象,它是一个 TransactionAwareDataSourceProxy 实例,所以一切都应该到位。数据集中的所有数据都已提交和持久化,而在 Spring 托管会话中添加/修改的所有数据都没有。
有没有人知道我可能会错过什么,或者之前有没有人这样做并遇到过同样的麻烦?
当前代码(尝试使用和不使用 TransactionAwareDataSourceProxy)。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
RecipeManagementITConfig.class,
SpringJpaTestConfig.class,
DatabaseITConfig.class
},
initializers = {PleaseWork.class})
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class
})
@TransactionConfiguration(defaultRollback = true)
@Transactional
public class DefaultIngredientServiceIT {
@Autowired
protected DataSource dataSource;
@Before
public void init() throws Exception {
System.out.println("> " + dataSource); // org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy@d4ce346
dbTester = new DataSourceDatabaseTester(dataSource);
dbTester.setDataSet(getDataSet());
dbTester.setSetUpOperation(DatabaseOperation.REFRESH);
dbTester.onSetup();
}
@After
public void destroy() throws Exception {
dbTester.onTearDown();
}
private IDataSet getDataSet() throws Exception {
return new FlatXmlDataSetBuilder().build(getClass().getResourceAsStream("/dataset.xml"));
}
@Transactional
@Test
public void testDeletionOfIngredients() {
(...)
}
}
【问题讨论】:
标签: java spring hibernate transactions dbunit