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);
    }
    }

  • 相关阅读:
    java并发编程的艺术笔记-第二章
    java并发编程的艺术笔记-第一章
    Class字节码的加载
    Maven学习笔记(1)
    深入分析java web技术内幕读书笔记-第一章
    VMware虚拟机扩展内存和磁盘
    【避坑】for循环删除列表元素的注意事项--remove函数逆序删除
    虚拟机无法上网问题解决
    jmeter变量跨线程组使用--设置全局变量
    常见慢查询原因
  • 原文地址:https://www.cnblogs.com/shine_cn/p/2473878.html
Copyright © 2011-2022 走看看