论坛首页 综合技术论坛

DBUnit的疑惑

浏览 7940 次
锁定老帖子 主题:DBUnit的疑惑
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-09  

        在单元测试中测试DAO,我们通常都需要初始化一些数据,这时使用DBUnit就比较方便,只需要在XML文件中写就可以了。但比较让我困惑的是DBUnit初始化数据是直接提交到数据库的,这样如果我们需要在执行完测试后将数据库恢复成原始状态就显的异常的困难。尤其在使用Spring的AbstractTransactionalDataSourceSpringContextTests做测试时,我们不需要显示的设置事务回滚,所有的测试代码执行完后就自动回滚了。找了很多资料也没发现DBUnit有这样的功能。请问谁有好的办法没有?另外如果使用DBUnit的时候完全可以只初始化一次数据,不必每次在setUp的时候执行一遍。请问这样的做法是否妥当?

我的代码:

java 代码
  1. /**  
  2.  * 由DBUnit初始化数据.  
  3.  *   
  4.  * @param dataName 数据配置文件名称  
  5.  *   
  6.  * @throws Exception  
  7.  */  
  8. protected void initData(String dataName) throws Exception   
  9. {          
  10.     IDatabaseConnection connection = null;   
  11.     IDataSet dataSet = null;   
  12.     this.jdbcTemplate.getDataSource().getConnection().setAutoCommit(false);   
  13.     connection =  new DatabaseConnection(this.jdbcTemplate.getDataSource().getConnection());          
  14.     logger.info("连接的数据库为:"+this.jdbcTemplate.getDataSource().getConnection().getCatalog());   
  15.     ClassPathResource cpr = new ClassPathResource(dataName+"-data.xml");             
  16.     dataSet = new XmlDataSet(cpr.getInputStream());                
  17.     InsertIdentityOperation.CLEAN_INSERT.execute(connection, dataSet);   
  18. }  
   发表时间:2007-04-09  
dbunit需要扩展事务处理,参考spring吧。
一次初始化数据可以采用,
建议为数据库建库脚本中的demodata,是所有测试都会使用的基础数据,且再测试过程中不会改变。

其他测试逻辑相关的数据都再setup时重新生成,保证测试用例tesecase的独立性,
如果采用事务可省略此步骤。
0 请登录后投票
   发表时间:2007-04-09  
通过共用Spring的Datasource,解决了事务问题。但是又发现了另外一个问题,由于是使用的MSSQL2000的自增主键,在DBUNIT中就要使用InsertIdentityOperation了;然而由于使用的事务,InsertIdentityOperation.CLEAN_INSERT中的更新语句并未实时提交,造成了InsertIdentityOperation失效,郁闷啊~~~~~
看来DBUNIT只能做初始化数据库用,让数据库达到一个已知状态。
0 请登录后投票
   发表时间:2007-04-09  
经检查可能是DBUnit使用了executeBatch造成的
0 请登录后投票
   发表时间:2007-04-09  
在InsertIdentityOperation中发现了jdbcConnection.commit();和jdbcConnection.setAutoCommit(true);语句。造成Spring事务异常,所以只能使用DatabaseOperation,并手工设置IDENTITY_INSERT
0 请登录后投票
   发表时间:2007-04-09  
自己解决,顶一个。有谁使用MSSQL2000自增主键+DBUnit+AbstractTransactionalDataSourceSpringContextTests的可以找我深入研究一下
0 请登录后投票
   发表时间:2007-04-09  
事务控制一定要注意,不要生写con.commit(),auto commit(),和spring事务管理有冲突。
0 请登录后投票
   发表时间:2007-05-02  
你好,我和你一样也在使用相同的测试方式。
并且出现的问题也一样。
dao用的是hibernate,测试时经常出现update,save,delete不提交,但如果在这些操作后执行一个查询就可以了。也没有找到根本原因,希望能与楼主交流。
0 请登录后投票
   发表时间:2007-05-08  
zdonking 写道
你好,我和你一样也在使用相同的测试方式。
并且出现的问题也一样。
dao用的是hibernate,测试时经常出现update,save,delete不提交,但如果在这些操作后执行一个查询就可以了。也没有找到根本原因,希望能与楼主交流。
Hibernate没有flush的缘故,所以实际上操作并未提交到数据库,如果你使用spring的话可以使用一个拦截器,在每个方法执行后对Hibernate做一次commit操作.
0 请登录后投票
   发表时间:2007-05-18  
谢谢你的回答,我等会儿试下。
不知道commit有没有用,之前碰到的情况甚至是flush也没有用。
除非执行一条query 语句。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics