shine_cn

Your heart is free, so have the courage to follow it.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Unitils中DataSetLoadStrategy简介及定制方法 (转载)

Posted on 2012-04-27 17:14  shine_cn  阅读(323)  评论(0编辑  收藏  举报

转自:http://qa.taobao.com/?p=5212

 

Unitils作为单元测试的首选辅助工具,在测试数据准备方面提供了相当良好的支持。要用到Unitils的数据支持就免不了跟下面的两个配置项打交道:
DbUnitModule.DataSet.loadStrategy.default;
DbUnitModule.DataSet.factory.default;
其中第一项用于Unitils数据装载的策略,为本文介绍的内容。Unitils默认提供了以下四个数据装载策略:
CleanInsertLoadStrategy;
InsertLoadStrategy;
RefreshLoadStrategy;
UpdateLoadStrategy;
CleanInsertLoadStrategy的数据装载方式为先将dataset涉及的表清空再插入数据,这个策略可以保证测试时不会被原有数据的影响,但缺点是如果原有数据不应该被删除这个策略就不适用了;
InsertLoadStrategy的数据装载方式是将dataset的数据直接插入数据库,该策略简单明了,但缺点也是明显的,当数据库存在主键或或唯一索引冲突的时候,便会插入失败,此时Unitils会报错,并给出错误信息;
RefreshLoadStrategy的数据装载方式是检查数据库中是否有和dataset中相同的数据,如果有则将数据库中的数据按照dataset的进行更新,如果没有则将dataset中的数据插入数据库中。
UpdateLoadStrategy的数据装载方式是将dataset中的数据更新到数据库中,如果数据库中没有对应的数据则不做处理。
Unitils中自带的这四种数据处理策略应可以满足大部分的需求了,但如果这四种策略中没有能满足你的需求的怎么办,没事,Unitils是开源的你可以根据你的需求自己去定制你的策略。在介绍定制方法前,我们先看下Unitils是怎么实现自己的数据加载策略的。
在Unitils中,四个加载策略都是org.unitils.dbunit.datasetloadstrategy.impl. BaseDataSetLoadStrategy的子类,以不同的方式实现BaseDataSetLoadStrategy的doExecute方法来提 供不同的策略,以CleanInsertLoadStrategy为例,它对doExecute方法的实现如下:
@Override
public void doExecute(DbUnitDatabaseConnection dbUnitDatabaseConnection, IDataSet dataSet) throws DatabaseUnitException, SQLException {
DatabaseOperation.CLEAN_INSERT.execute(dbUnitDatabaseConnection, dataSet);
}
可以看到它是直接通过DBUnit的DatabaseOperation提供的DatabaseOperation.CLEAN_INSERT的,,DBunit一共提供了一下几种操作:
DatabaseOperation NONE = new DummyOperation();
DatabaseOperation UPDATE = new UpdateOperation();
DatabaseOperation INSERT = new InsertOperation();
DatabaseOperation REFRESH = new RefreshOperation();
DatabaseOperation DELETE = new DeleteOperation();
DatabaseOperation DELETE_ALL = new DeleteAllOperation();
DatabaseOperation TRUNCATE_TABLE = new TruncateTableOperation();
DatabaseOperation CLEAN_INSERT = new CompositeOperation(
DELETE_ALL, INSERT);
我们可以根据自己的需求将这几种操作进行组合来完成自己的需求,如当我们需要将Dataset的对应的数据先删除,然后再插入,我们只要进行一下实现就可以了:
public class DeleteInsertLoadStrategy extends BaseDataSetLoadStrategy {
@Override
public void doExecute(DbUnitDatabaseConnection dbUnitDatabaseConnection, IDataSet dataSet) throws DatabaseUnitException, SQLException {
DatabaseOperation.DELETE.execute(dbUnitDatabaseConnection, dataSet);
DatabaseOperation.INSERT.execute(dbUnitDatabaseConnection, dataSet);
}
}