`
zhangxiaoming
  • 浏览: 25697 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

DBUnit 支持Blob Clob

阅读更多

    在测试的时候,我们有时需要为数据库准备二进制数据,比如遇到ORACLE的 BLOB 类型的字段。BLOB可以存放任意的二进制数据,比如图片等。dbUnit从2.1版开始加入了对BLOB的支持(原文:“Ability to import external file for binary data types like BLOB; the value can be either a qualified URL or a file path name.”)但却没有给出任何文档说明何为“a qualified URL or a file path name”。而且看似要为每个二进制数据准备不同的文件,这也容易加大测试文件管理的复杂度,特别是有时候我们也许只需要输入几个byte的数据,这样我们就需要对dbUnit做一些进一步的开发来支持直接在种子文件中处理二进制数,其中主要利用ReplacementDataSet这个类。


    在详细说明如何支持二进制数之前先介绍以下如何支持空数据,假设种子文件中存在以下内容:

<?xml version='1.0' encoding='UTF-8'?> 
<DATASET> 
    <ACCOUNT id="1"
             username="Drew"
             password="[NULL]"
    />
    ……
</DATASET> 



    这条记录的密码允许为空,‘[NULL]’不是dbUnit的关键字,是我们自己定义的。在被提交给dbUnit之前,我们必须将它过滤掉,并用真正的null替代:

@Override 
protected IDataSet getDataSet() throws Exception  { 
	ReplacementDataSet dataSetnew FlatXmlDataSet((
	     new ReplacementDataSet(
                  new FileInputStream(“dataSetFilePath”))));
        dataFilter(dataSet);
        return dataSet;
} 
private void dataFilter(ReplacementDataSet dataSet) throws DataSetException { 
    // Filter NULL
    dataSet.addReplacementObject("[NULL]", null);
} 



    这样dataSet中的,被标记为”[NULL]”的值就都被null替换掉了。用这里我们用最简单的方式演示了ReplacementDataSet类的作用。类似的方法我们也可以让dbUnit替换我们需要转换成二进制的数据。现假设种子数据为以下形式:

<?xml version='1.0' encoding='UTF-8'?> 
<DATASET> 
    <ACCOUNT id="1"
             username="Drew"
             password="[NULL]"
             logonhours="[BINARY:e0ff01e0ff01e0ff01e0ff01e0ff01]"
    />
     ……
</DATASET> 



    和上例一样,这里的[BINARY:….]是我们自己定义的。我们只需要在提交给dbUnit之前找到并替换掉它就可以了,让我们扩充一下dataFilter方法,代码如下:

private void dataFilter(ReplacementDataSet dataSet) throws DataSetException { 
    static final String replacementPattern = "^\\[([^]]*)\\]$";
    static final String dataTypePattern = "^\\w+:*";
    static final String DATA_TYPE_NULL = "NULL";
    static final String DATA_TYPE_BINARY = "BINARY";
    static final String DATA_TYPE_FILE = "FILE";
    // Filter NULL
    dataSet.addReplacementObject("[" + DATA_TYPE_NULL +"]", null);
    ITableIterator tables = dataSet.iterator();
    // Fetch tables(1)
    while(tables.next()) {
        ITable table = tables.getTable();
        ITableMetaData metaData = table.getTableMetaData();
        Column[] columns = metaData.getColumns();
        // Fetch rows (2)
        int rowCount = table.getRowCount();
        for(int row=0; row<rowCount; row++){
            // Fetch columns (3)
            for(int i=0; i<columns.length; i++) {
            Column c = columns[i];
            String name = c.getColumnName();
            if(name.equals("logonhours")){
                logger.info("logonhours!!");
            }
            // Check value (4)
            String value = (String)table.getValue(row, name);
            if(null != value) {
                // Find "[TYPE:VALUE]"
                Pattern p=Pattern.compile(replacementPattern);
                Matcher m=p.matcher(value);
                if(m.find()) {
                    String matchedData = m.group(0);
                    String data= matchedData.substring(1,matchedData.length()-1);
                    p = Pattern.compile(dataTypePattern);
                    m = p.matcher(data);
                    if(m.find()) {
                        String type = m.group(0);
                        String v = data.substring(type.length());
                        type = type.substring(0,type.length()-1); 

                        // Filter Binary data (5)
                        if(type.toUpperCase().equals(DATA_TYPE_BINARY) {
                            byte[] bin = new byte[v.length()/2];
                            for(int index = 0; index<v.length()/2; index++) {
                                bin[index] =Integer.valueOf(v.substring(index*2,index*2+2),16).byteValue();
                            }
                            dataSet. addReplacementObject(matchedData,bin);
                        }
                         // Filter Binary data  end
                        if(type.toUpperCase().equals(DATA_TYPE_FILE)) {
                            logger.info( "Load data from file:"+v);
                        } else { 
                        logger.warn("Unsupport data type."); 
                        } 
                    } 
                 } 
             } 
          } 
       } 
    } 
} 

 

  1. 我们读取种子文件中的每一个表
  2. 然后读取每个表中的记录
  3. 再获得每条记录的字段
  4. 最后我们检查这些字段
  5. 并过滤出我们定义的关键字

      Filter Binary data 代码,们取出BINARY后面的字串并转换成byte[]类型,然后再放回去,这样就将文本输入转换成了二进制输入。


    这个方法还有些不完善的地方,首先,它只能简单的处理16进制输入,不能支持十进制,如果要支持十进制的话还需要进一步转换。其次,用类似的方法还可以处理文件输入,将输入定义成’[FILE:path_to_file]’的形式,然后在灰色代码部分实现对文件的读取并转换成二进制输入就可以。


    虽然dbUnit的设计初衷很好,但是不知为什么开发的很不完善,如果不做二次开发几乎是无法使用,但是只要经过合适的二次开发,它还是可以很好的满足需求。

 

分享到:
评论
1 楼 applebomb 2011-05-31  
不指定文件也不用二次开发,blob字段使用base64即可

相关推荐

    dbunit-2.4.7所有jar以及dbunit入门教程

    7. 处理复杂数据类型:说明如何处理 BLOB、CLOB 和自定义数据类型。 8. 执行测试:给出一个完整的测试用例示例,展示如何在 JUnit 测试中整合 DBUnit。 学习和掌握 DBUnit 能够显著提高数据库测试的效率和质量,...

    dbunit开发文档

    1. 复杂数据类型:DBUnit 支持序列化复杂的对象,如 Java 对象和 Blob/Clob 数据。 2. 轻量级模式:轻量级模式允许你只操作特定的表,而不会影响其他表。 3. 断言:DBUnit 提供了丰富的断言方法,如 `...

    dbunit-2.0-src.zip_dbunit src_dbunit-2.1-src

    4. 数据类型支持:DBUnit支持多种数据库数据类型,包括基本类型和复杂类型,如BLOB和CLOB。 5. 载入和卸载数据:`IDataSet`接口是DBUnit处理数据集的核心,它定义了如何加载和卸载数据到数据库。`FlatXmlDataSet`、...

    DBUNIT使用

    DBUNIT 使用 DbUnit 是一种用于数据库集成测试的重要工具,它提供了TestCase 子类,用户可以在自己的测试类中扩展它们,但也可以独立于 JUnit 以其他方式来使用 DbUnit。DbUnit 的主要用途是准备数据库和验证数据库...

    dbunit-2.4.9 源码

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架的一部分,提供了数据驱动测试的解决方案。在版本 2.4.9 中,DBUnit 提供了一系列的功能,帮助开发者在进行单元测试时能够管理和操作数据库的...

    dbunit2.2

    1. **数据导入导出**:DBUnit 支持多种格式的数据导入和导出,包括CSV、XML和Flat XML(一种简化版的XML格式)。这使得数据的准备和验证变得更加方便。 2. **操作模式**:DBUnit 提供了三种操作模式:CLEAN_INSERT...

    dbunit测试demo

    3. **操作模式(Operation Mode)**:DBUnit 支持几种操作模式,如 `CLEAN_INSERT`(清除现有数据并插入新数据)、`INSERT`(只插入新数据,不删除)、`UPDATE`(更新现有数据)、`OVERWRITE`(覆盖现有数据)等。...

    Dbunit数据库连接下载

    Dbunit 是一个强大的Java库,专门用于数据库的测试和数据管理。它被广泛应用于软件开发过程中,特别是对于那些依赖于数据库的应用程序,因为Dbunit能够帮助开发者有效地管理和控制数据库的状态,确保测试的一致性...

    dbunit帮助文档(HTML版)

    获取更多支持。 总之,DBUnit帮助文档(HTML版)为开发者提供了一站式的数据库测试解决方案,无论是初学者还是经验丰富的测试人员,都能从中受益。通过深入学习和实践,你可以更有效地管理和维护数据库状态,确保测试...

    DBUnit 进行单元测试

    DBUnit 支持多种操作,如INSERT、UPDATE、DELETE,以及清理数据库的IDENTITY_INSERT和CLEAN_INSERT模式。其中,CLEAN_INSERT模式会删除现有数据并重新插入测试数据,而IDENTITY_INSERT则允许处理带有自动递增字段的...

    DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类

    DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类...

    dbunit使用实例

    2. **操作模式(Operation)**: DBUnit 支持多种操作,如 `CLEAN_INSERT`、`INSERT`、`UPDATE` 和 `DELETE`,它们分别对应清除并插入新数据、只插入新数据、更新现有数据和删除数据。 3. **类型映射(Type Mapping...

    dbunit使用必需Jar包

    2. **junit.jar**:JUnit 是一个流行的单元测试框架,DBUnit 常常与之配合使用,提供对数据库层的测试支持。它提供了断言、测试套件和测试监听器等机制,使得编写和运行测试变得简单。 3. **commons-dbcp.jar** 或 ...

    dbunit入门实例

    5. **灵活性**:DbUnit 支持多种数据库,包括 MySQL、Oracle、SQL Server 等,并且可以与 JUnit 和 TestNG 等测试框架无缝集成。 **安装与配置** 要在项目中使用 DbUnit,首先需要将其添加为项目的依赖。如果你...

    单元测试JUnit4和DbUnit

    2. **数据驱动测试**:DbUnit支持数据集的参数化,可以通过不同的数据组合运行相同的测试逻辑,提高测试覆盖率。 3. **数据比较**:DbUnit提供了一种机制来比较数据库的实际状态与期望状态,确保数据一致性。 4. **...

    spring与dbunit集成测试

    DBUnit支持多种数据库,并提供了一套丰富的API来操作数据。 集成Spring和DBUnit,主要目的是为了在测试环境中对数据库操作进行控制,确保测试的隔离性和准确性。以下是一些关键步骤: 1. **配置Spring测试环境**:...

    dbunit-2.2.3-prj.rar_DbUnit 2.2_dbunit_单元测试

    1. 数据导入导出:DbUnit 支持从XML文件导入和导出数据库数据,这样可以方便地创建和恢复数据库的特定状态。XML格式的数据集提供了结构化的数据表示,方便编写和维护。 2. 数据库操作:它提供了一系列API来填充...

    DBUnit最佳实践之使用ant命令

    DBUnit 是一个 Java 开发者常用的数据库测试工具,它与JUnit等测试框架配合,能够帮助开发者在测试过程中管理和填充数据库,确保数据的一致性和准确性。本文将深入探讨如何结合Ant构建自动化测试流程,利用DBUnit...

    dbunit单元测试

    DBUnit还支持多种高级特性,如: - **复合数据集**:一个测试可能需要多个数据集,DBUnit允许组合多个数据集以满足复杂场景。 - **异常处理**:可以设置期望的SQL异常,确保在特定条件下抛出异常。 - **类型映射*...

Global site tag (gtag.js) - Google Analytics