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

  • 相关阅读:
    luogu 2491 [SDOI2011]消防 / 1099 树网的核 单调队列 + 树上问题
    BZOJ 1179: [Apio2009]Atm tarjan + spfa
    BZOJ 1112: [POI2008]砖块Klo Splay + 性质分析
    BZOJ 1596: [Usaco2008 Jan]电话网络 树形DP
    BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛 树形DP
    CF286E Ladies' Shop FFT
    CF528D Fuzzy Search FFT
    BZOJ 3771: Triple 生成函数 + FFT
    BZOJ 3513: [MUTC2013]idiots FFT
    python爬虫网页解析之parsel模块
  • 原文地址:https://www.cnblogs.com/shine_cn/p/2473878.html
Copyright © 2011-2022 走看看