在测试的时候,我们有时需要为数据库准备二进制数据,比如遇到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.");
}
}
}
}
}
}
}
}
- 我们读取种子文件中的每一个表
- 然后读取每个表中的记录
- 再获得每条记录的字段
- 最后我们检查这些字段
- 并过滤出我们定义的关键字
Filter Binary data 代码,们取出BINARY后面的字串并转换成byte[]类型,然后再放回去,这样就将文本输入转换成了二进制输入。
这个方法还有些不完善的地方,首先,它只能简单的处理16进制输入,不能支持十进制,如果要支持十进制的话还需要进一步转换。其次,用类似的方法还可以处理文件输入,将输入定义成’[FILE:path_to_file]’的形式,然后在灰色代码部分实现对文件的读取并转换成二进制输入就可以。
虽然dbUnit的设计初衷很好,但是不知为什么开发的很不完善,如果不做二次开发几乎是无法使用,但是只要经过合适的二次开发,它还是可以很好的满足需求。
分享到:
相关推荐
7. 处理复杂数据类型:说明如何处理 BLOB、CLOB 和自定义数据类型。 8. 执行测试:给出一个完整的测试用例示例,展示如何在 JUnit 测试中整合 DBUnit。 学习和掌握 DBUnit 能够显著提高数据库测试的效率和质量,...
1. 复杂数据类型:DBUnit 支持序列化复杂的对象,如 Java 对象和 Blob/Clob 数据。 2. 轻量级模式:轻量级模式允许你只操作特定的表,而不会影响其他表。 3. 断言:DBUnit 提供了丰富的断言方法,如 `...
4. 数据类型支持:DBUnit支持多种数据库数据类型,包括基本类型和复杂类型,如BLOB和CLOB。 5. 载入和卸载数据:`IDataSet`接口是DBUnit处理数据集的核心,它定义了如何加载和卸载数据到数据库。`FlatXmlDataSet`、...
DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架的一部分,提供了数据驱动测试的解决方案。在版本 2.4.9 中,DBUnit 提供了一系列的功能,帮助开发者在进行单元测试时能够管理和操作数据库的...
1. **数据导入导出**:DBUnit 支持多种格式的数据导入和导出,包括CSV、XML和Flat XML(一种简化版的XML格式)。这使得数据的准备和验证变得更加方便。 2. **操作模式**:DBUnit 提供了三种操作模式:CLEAN_INSERT...
3. **操作模式(Operation Mode)**:DBUnit 支持几种操作模式,如 `CLEAN_INSERT`(清除现有数据并插入新数据)、`INSERT`(只插入新数据,不删除)、`UPDATE`(更新现有数据)、`OVERWRITE`(覆盖现有数据)等。...
DBUNIT 使用 DbUnit 是一种用于数据库集成测试的重要工具,它提供了TestCase 子类,用户可以在自己的测试类中扩展它们,但也可以独立于 JUnit 以其他方式来使用 DbUnit。DbUnit 的主要用途是准备数据库和验证数据库...
Dbunit 是一个强大的Java库,专门用于数据库的测试和数据管理。它被广泛应用于软件开发过程中,特别是对于那些依赖于数据库的应用程序,因为Dbunit能够帮助开发者有效地管理和控制数据库的状态,确保测试的一致性...
获取更多支持。 总之,DBUnit帮助文档(HTML版)为开发者提供了一站式的数据库测试解决方案,无论是初学者还是经验丰富的测试人员,都能从中受益。通过深入学习和实践,你可以更有效地管理和维护数据库状态,确保测试...
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 基类...
2. **操作模式(Operation)**: DBUnit 支持多种操作,如 `CLEAN_INSERT`、`INSERT`、`UPDATE` 和 `DELETE`,它们分别对应清除并插入新数据、只插入新数据、更新现有数据和删除数据。 3. **类型映射(Type Mapping...
2. **junit.jar**:JUnit 是一个流行的单元测试框架,DBUnit 常常与之配合使用,提供对数据库层的测试支持。它提供了断言、测试套件和测试监听器等机制,使得编写和运行测试变得简单。 3. **commons-dbcp.jar** 或 ...
5. **灵活性**:DbUnit 支持多种数据库,包括 MySQL、Oracle、SQL Server 等,并且可以与 JUnit 和 TestNG 等测试框架无缝集成。 **安装与配置** 要在项目中使用 DbUnit,首先需要将其添加为项目的依赖。如果你...
2. **数据驱动测试**:DbUnit支持数据集的参数化,可以通过不同的数据组合运行相同的测试逻辑,提高测试覆盖率。 3. **数据比较**:DbUnit提供了一种机制来比较数据库的实际状态与期望状态,确保数据一致性。 4. **...
DBUnit支持多种数据库,并提供了一套丰富的API来操作数据。 集成Spring和DBUnit,主要目的是为了在测试环境中对数据库操作进行控制,确保测试的隔离性和准确性。以下是一些关键步骤: 1. **配置Spring测试环境**:...
1. 数据导入导出:DbUnit 支持从XML文件导入和导出数据库数据,这样可以方便地创建和恢复数据库的特定状态。XML格式的数据集提供了结构化的数据表示,方便编写和维护。 2. 数据库操作:它提供了一系列API来填充...
DBUnit 是一个 Java 开发者常用的数据库测试工具,它与JUnit等测试框架配合,能够帮助开发者在测试过程中管理和填充数据库,确保数据的一致性和准确性。本文将深入探讨如何结合Ant构建自动化测试流程,利用DBUnit...
DBUnit还支持多种高级特性,如: - **复合数据集**:一个测试可能需要多个数据集,DBUnit允许组合多个数据集以满足复杂场景。 - **异常处理**:可以设置期望的SQL异常,确保在特定条件下抛出异常。 - **类型映射*...