【问题标题】:DBUnit load dataset and rollbackDBUnit 加载数据集和回滚
【发布时间】: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


    【解决方案1】:

    尝试像这样使用DataSourceDatabaseTester

    public class MyTestCase {  
    
       @Autowired
       private DataSource dataSource;  
    
       private IDatabaseTester dbTester;  
    
        @Before
        public void init() throws Exception {  
          dbTester = new DataSourceDatabaseTester( getDataSource() );  
          dbTester.setDataSet( getDataSet() );  
          dbTester.onSetUp();  
        }  
    
        @Destroy
        public void destroy() throws Exception {  
          dbTester.onTearDown();  
        }  
    
        private IDataSet getDataSet() throws Exception {  
          return new FlatXmlDataSet(new FileInputStream("dataset.xml"));  
        } 
    }  
    

    【讨论】:

    • 嗨。谢谢回答。我相信你所说的只是我所做的事情的包装。我会试一试,但我怀疑这会解决我的问题。
    • 我刚刚尝试了您的解决方案,但它不起作用。我什至补充了事务感知代理,但它仍然不起作用:/
    • 尝试添加@TransactionConfiguration(defaultRollback=true) 并将测试标记为@Transactional。所有更改都应回滚,即使是 DBUnit 更改。
    • 我已经用无效的代码更新了帖子。也已经有了您的最新建议。你能看出什么不对吗?
    • 看起来不错。在调试它时,检查 @Before 方法中是否获得相同的事务。 TransactionInterceptor 应该已经在你的堆栈中了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多