Java – 让DbUnit使用Hibernate事务

前端之家收集整理的这篇文章主要介绍了Java – 让DbUnit使用Hibernate事务前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在尝试将Hibernate事务中的更改推送到数据库以使DbUnit在我的测试用例中正常工作时遇到问题.似乎DbUnit没有看到Hibernate所做的更改,因为它们还没有在事务结束时提交……而且我不确定如何重构我的测试用例以使其工作.

这是我过度简化的测试用例来证明我的问题: –

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration(locations = {
  3. "classpath:applicationContext-test.xml"
  4. })
  5. @TransactionConfiguration(transactionManager = "transactionManager")
  6. @Transactional
  7. public class SomeTest {
  8. @Autowired
  9. protected DataSource dataSource;
  10. @Autowired
  11. private SessionFactory sessionFactory;
  12. @Test
  13. public void testThis() throws Exception {
  14. Session session = sessionFactory.getCurrentSession();
  15. assertEquals("initial overlayType count",4,session.createQuery("from OverlayType").list().size());
  16. //-----------
  17. // Imagine this block is an API call,ex: someService.save("AAA");
  18. // But for the sake of simplicity,I do it this way
  19. OverlayType overlayType = new OverlayType();
  20. overlayType.setName("AAA");
  21. session.save(overlayType);
  22. //-----------
  23. // flush has no effect here
  24. session.flush();
  25. assertEquals("new overlayType count",5,session.createQuery("from OverlayType").list().size());
  26. // pull the data from database using dbunit
  27. IDatabaseConnection connection = new DatabaseConnection(dataSource.getConnection());
  28. connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,new MysqLDataTypeFactory());
  29. QueryDataSet partialDataSet = new QueryDataSet(connection);
  30. partialDataSet.addTable("resultSet","select * from overlayType");
  31. ITable actualTable = partialDataSet.getTable("resultSet");
  32. // FAIL: Actual row count is 4 instead of 5
  33. assertEquals("dbunit's overlayType count",actualTable.getRowCount());
  34. DataSourceUtils.releaseConnection(connection.getConnection(),dataSource);
  35. }
  36. }

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

>调用someService.save(…)将数据保存到多个表中.
>使用DbUnit从XML获取预期的表.
>使用DbUnit从数据库获取实际表.
> Dosertion.assertEquals(expectedTable,actualTable);.

但是,在这一点上,我无法让DbUnit看到Hibernate在事务中所做的更改.

我应该如何改变以使DbUnit与Hibernate事务很好地协作?

谢谢.

最佳答案
我从来没有使用过DbUnit,但似乎TransactionAwareDataSourceProxy会做到这一点.基本上,您需要使用此代理包装原始数据源并使用它代替,以便此代码

  1. new DatabaseConnection(dataSource.getConnection())

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

我发现Transaction aware datasource (use dbunit & hibernate in spring)博客文章解释了这一点.

另一种方法是完全跳过事务测试并手动清理数据库.看看我的transactional tests considered harmful artcle.

猜你在找的Spring相关文章