使用DBUnit做单元测试

               

    DBUnit是一个方便的数据准备工具, 方便于我们做单元测试的时候准备数据, 它的数据准备是基于XML格式的, 如下:

<?xml version='1.0' encoding='UTF-8'?><dataset>  <YourTableName_1 Field_1="1" Field_2="f2" Field_3="f3"/>  <YourTableName_1 Field_1="2" Field_2="f2_1" Field_3="f3_1"/>  <YourTableName_2 Field_1="1" Field_2="2"/></dataset>

    DBUnit的一个XML数据文件中,可以同时放多个表的数据,并且可以方便的把上面XML中准备的数据插入倒数据库中. 只需要使用下面简单的代码就可以做到:

  protected ReplacementDataSet createDataSet(InputStream is) throws Exception {   return new ReplacementDataSet(new FlatXmlDataSetBuilder().build(is));  }  ReplacementDataSet createDataSet = createDataSet(Thread.currentThread().getContextClassLoader().getResourceAsStream("data.xml"));  DatabaseOperation.INSERT.execute(iconn, createDataSet);
     注:准备这处XML数据文件时,一定要把同一个表中字段数最多的记录放在前面,因为DBUnit在根据数据XML文件准备表的元数据字段的时候,是以当前表的第一记录为主的。如下面这个XML文件:

<?xml version='1.0' encoding='UTF-8'?><dataset>  <YourTableName_1 Field_1="1" Field_2="f2"/>  <YourTableName_1 Field_1="2" Field_2="f2_1" Field_3="f3_1"/>  <YourTableName_2 Field_1="1" Field_2="2"/></dataset>

    Table YourTableName_1有三个字段,但是第三个字段Field_3是允许为空的,所以上面的XML是可以这样写的,并且DBUnit在执行插入的时候也不会报错,但是这里会出现一个问题,因为DBUnit在第一次分析到table YourTableName_1时,第一条记录只有两个字段,因而它在记录table YourTableName_1的字段的时候,就只会记录两个到这个表的元数据信息,因而在对在对后面记录进行数据处理的时候,只会取后面记录的两个字段,而第三个字段是不会被插入到数据库中。解决这个问题很简单,把YourTableName_1的第二条记录和第一条记录给换一下位置就好了。 同理,在数据result数据文件的时候,也要遵循这样的规则,否则会得不到想要的结果的。这是 经验总结。

    你可能会担心如果是要准备的数据比较多是不是会比较麻烦,如上百条的数据准备,这个可以不用担心,因为使用DBUnit可以方便的从数据库中导出数据到指定的文件中,然后供我们使用,使用以下这个方法就可以导出数据:


 /**  * Export data for the table names by the given IDatabaseConnection into the resultFile.<br>  * The export data will be DBUnit format.  *   * @param conn  * @param tableNameList  * @param resultFile  * @throws SQLException  * @throws DatabaseUnitException  * @throws FileNotFoundException  * @throws IOException  */ public void exportData(IDatabaseConnection iconn, List<String> tableNameList, String resultFile) throws SQLException, DatabaseUnitException, FileNotFoundException, IOException {  QueryDataSet dataSet = null;  if (iconn == null) {   return;  }  if (tableNameList == null || tableNameList.size() == 0) {   return;  }  try {   dataSet = new QueryDataSet(iconn);   for (String tableName : tableNameList) {    dataSet.addTable(tableName);   }  } finally {   if (dataSet != null) {    FlatXmlDataSet.write(dataSet, new FileOutputStream(resultFile));   }  } }

    DBUnit的另一个非常有用的功能,就是对执行结果进行比较,这样可以直接得到执行结果是否正确。 操作方式是准备一个执行期待结果的XML文件,再准备一条从数据库查询结果的SQL。这里有一个经验非常重要,那就是用于查询的执行结果的SQL文件,最好是加上某个关键字段的ORDER BY语句,否则可能会因为记录的顺序而比较失败,因为DBUnit是把查询出来的结果和准备的结果进行一一对应的比较。当然,既然SQL查询都加上了排序,那我们的结果XML文件,也应该是根据关键字段排好序的结果的,否则也会因为记录的顺序问题而比较失败。

上面的是热身,该来点实际的东西了, 弄个真实的实例来看看,下面是一个用于DBUnit测试的抽象类:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值