zoukankan      html  css  js  c++  java
  • Unitils中DataSetLoadStrategy简介及定制方法 (转载)

    转自: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);
    }
    }

  • 相关阅读:
    源码编译安装 screen
    关于精简安装office2010的步骤
    关于shell脚本时遇value too great for base (error token is "08")
    关于web服务器访问速度慢的一些简单解决方法
    vim 打开Linux下文件每一行后面都有^M的样式
    logrotate关于日志轮询和分割
    补实验四及第二章家庭作业
    第五周学习总结
    第四周学习总结
    第三周学习总结
  • 原文地址:https://www.cnblogs.com/shine_cn/p/2473878.html
Copyright © 2011-2022 走看看