首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让DbUnit处理Hibernate事务

让DbUnit处理Hibernate事务
EN

Stack Overflow用户
提问于 2011-12-21 14:34:24
回答 2查看 6.4K关注 0票数 6

我在试图将Hibernate事务中所做的更改推送到数据库以使DbUnit在测试用例中正常工作时遇到了问题。似乎DbUnit没有看到Hibernate所做的更改,因为它们还没有在事务结束时提交.我也不知道如何重组我的测试用例,让它发挥作用。

这里是我过于简化的测试用例来演示我的问题:-

代码语言:javascript
复制
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:applicationContext-test.xml"
})
@TransactionConfiguration(transactionManager = "transactionManager")
@Transactional
public class SomeTest {
    @Autowired
    protected DataSource dataSource;

    @Autowired
    private SessionFactory sessionFactory;

    @Test
    public void testThis() throws Exception {
        Session session = sessionFactory.getCurrentSession();

        assertEquals("initial overlayType count", 4, session.createQuery("from OverlayType").list().size());

        //-----------
        // Imagine this block is an API call, ex: someService.save("AAA");
        // But for the sake of simplicity, I do it this way
        OverlayType overlayType = new OverlayType();
        overlayType.setName("AAA");
        session.save(overlayType);
        //-----------

        // flush has no effect here
        session.flush();

        assertEquals("new overlayType count", 5, session.createQuery("from OverlayType").list().size());

        // pull the data from database using dbunit
        IDatabaseConnection connection = new DatabaseConnection(dataSource.getConnection());
        connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
        QueryDataSet partialDataSet = new QueryDataSet(connection);
        partialDataSet.addTable("resultSet", "select * from overlayType");
        ITable actualTable = partialDataSet.getTable("resultSet");

        // FAIL: Actual row count is 4 instead of 5
        assertEquals("dbunit's overlayType count", 5, actualTable.getRowCount());

        DataSourceUtils.releaseConnection(connection.getConnection(), dataSource);
    }
}

我使用DbUnit的全部想法是:-

  • Call someService.save(...),用于将数据保存到多个表中。
  • 使用DbUnit从XML获取预期的表;
  • 使用DbUnit从数据库获取实际的表。
  • DosomeService.save(...)

但是,此时,我无法让DbUnit看到Hibernate在事务中所做的更改。

我应该如何更改以使DbUnit能够很好地处理Hibernate事务?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-21 14:43:50

我从未与DbUnit合作过,但似乎TransactionAwareDataSourceProxy能做到这一点。基本上,您需要用这个代理包装原始数据源,然后使用它,这样代码就可以:

代码语言:javascript
复制
new DatabaseConnection(dataSource.getConnection())

实际上,通过代理并使用与Hibernate相同的事务和连接。

我发现的博客文章解释了这一点。

另一种方法是完全跳过事务测试,而不是手动地清理数据库。看看我的transactional tests considered harmful艺术品。

票数 9
EN

Stack Overflow用户

发布于 2011-12-21 14:42:43

看起来,该测试用例需要两个事务:一个用于将数据放入数据库,另一个用于检索数据。

我要做的是:

  • 使用内存数据库,以便在单元测试结束时清除数据。
  • 删除事务注释,并直接使用会话的beginTransaction和提交方法。

初始覆盖类型计数为0,并且在保存会话后,它应该是1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8591487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档