Dbunit的使用---dataset

关于IDataSet的使用,目前主要用到了FlatXmlDataSet ,XmlDataSet ,XlsDataset ,CompositeDataSet,ReplacementDataSet

 

FlatXmlDataSet

FlatXmlDataSet 是最常用的一种,文件格式是这样的

<dataset>

<TEST_TABLE COL0="row 0 col 0" COL1="row 0 col 1" COL2="row 0 col 2"/>

<TEST_TABLE COL1="row 1 col 1"/>

<SECOND_TABLE COL0="row 0 col 0" COL1="row 0 col 1" />

<EMPTY_TABLE/>

</dataset>

举例说明用法, 有这样一个xml文件: src\test\resources\dataset\invoke_webservice_log.xml

<dataset>

<dhzx_webservice_local  id="1" visit_date ="[NOW]" status="1" remark="[UUID]" />

<dhzx_webservice_local  id="2" visit_date ="[NOW]" status="1"  />

<dhzx_webservice_log id="1" visit_date ="[NOW]" status="1" serial_number="[UUID]" />

<dhzx_invoke_log id="1" create_date="[NOW]" result="1" log_id="[LOGID]" />

</dataset>

 

Java代码操作xml一般是这样的:

public IDataSet createIDataSet() {

DataFileLoader loader = new FlatXmlDataFileLoader();

IDataSet dataSet = loader.load("/dataset/invoke_webservice_log.xml");

Map<String, Object> replacementObjects = Maps.newHashMap();

replacementObjects.put("[NOW]", new Date());

replacementObjects.put("[UUID]", uuid);

loader.addReplacementObjects(replacementObjects);

return dataSet;

}

解释一下: 这里面用到了FlatXmlDataFileLoader,这个是dbUnit自带的解析dataset文件的利器,非常好用,他还集成了ReplacementDataSet的功能,可以做变量替换 。

一般情况下,用FlatXmlDataSet+FlatXmlDataFileLoader的方式就能解决大部分问题,但是官网推荐使用XmlDataSet,因为字段是由第一行数据决定的,比如表dhzx_webservice_local的第一条数据有A B C三个字段,而第二条数据有A B C D四个字段,最终XmlDataSet还是以A B C三个字段为准,因此使用FlatXmlDataSet的时候一定要保证字段最全的数据在最前面。

 

XmlDataSet

XmlDataSet的xml文件需要使用dtd约束规范(FlatXmlDataSet并没有强制要求,我估计FlatXmlDataSet是它的默认实现吧),因此要先定义一个dtd文件,如下 dataset.dtd

<?xml version="1.0" encoding="UTF-8"?>

<!ELEMENT dataset (table+)>

<!ELEMENT table (column*, row*)>

<!ATTLIST table name CDATA #REQUIRED>

<!ELEMENT column (#PCDATA)>

<!ELEMENT row (value | null | none)*>

<!ELEMENT value (#PCDATA)>

<!ELEMENT null EMPTY>

<!ELEMENT none EMPTY>

 

然后再使用xml文件 ,文件名为dhzx_invoke_local_log.xml (注意其中的dataset.dtd即为上面定义的dtd文件)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE dataset SYSTEM "dataset.dtd">

<dataset>

<table name="dhzx_invoke_local_log">

<column>id</column>

<column>create_date</column>

<column>result</column>

<column>log_id</column>

<row>

<value>[LOGID]</value>

<value>[NOW]</value>

<value>1</value>

<value>[LOGID]</value>

</row>

</table>

</dataset>

 

Java代码是这样的(文件都存放在 src\test\resources\dataset目录下)

public IDataSet createIDataSet() throws Exception {

InputStream inputStream = this.getClass().getResource("/dataset/dhzx_invoke_local_log.xml").openStream();

ReplacementDataSet dataSet = new ReplacementDataSet(new XmlDataSet(inputStream));

dataSet.addReplacementObject("[NOW]", new Date());

dataSet.addReplacementObject("[LOGID]", logId);

return dataSet;

}

解释一下:这里主要使用了XmlDataSet和ReplacementDataSet ,XmlDataSet就是针对xml+dtd的解析,而ReplacementDataSet就是为了做文件中的标识替换

 

XlsDataSet

XlsDataSet使用excel作为数据源,每个sheet表示一个表,sheet名为表名,第一行为字段名,其它行表示字段值,如下图所示

 

初始化代码如下:

private static IDataSet createDataSet() throws Exception {

XlsDataFileLoader fileLoader = new XlsDataFileLoader();

IDataSet dataSet = fileLoader.load("/datasets/data.xlsx");

ReplacementDataSet replacementDataSet = new ReplacementDataSet(dataSet);

replacementDataSet.addReplacementObject("[NOW]", DateFormatUtils.format(new Date(), "yyyy-MM-dd"));

replacementDataSet.addReplacementSubstring("[UUID]", UUID.randomUUID().toString());

return replacementDataSet;

}

 

CompositeDataSet

 

顾名思义,这是一个组合式的dataset,即它可以把多个dataset组合为一个,而每个dataset对应一个xml,因此也可以说CompositeDataSet可以组合多个dataset的xml

具体例子不再细说,我们可以把图中的4个xml组合为一个,当然这里的4个xml用的式XmlDataset的方式,具体java代码式这样的

public IDataSet createIDataSet() throws Exception{

IDataSet[] iDataSets = new IDataSet[4] ;

InputStream inputStream = this.getClass().getResource("/dataset/dhzx_webservice_local_log.xml")

.openStream();

iDataSets[0] = new XmlDataSet(inputStream);



inputStream = this.getClass().getResource("/dataset/dhzx_invoke_local_log.xml")

.openStream();

iDataSets[1] = new XmlDataSet(inputStream);



inputStream = this.getClass().getResource("/dataset/dhzx_webservice_log.xml")

.openStream();

iDataSets[2] = new XmlDataSet(inputStream);



inputStream = this.getClass().getResource("/dataset/dhzx_invoke_log.xml")

.openStream();

iDataSets[3] = new XmlDataSet(inputStream);



//将4个dataset组合为一个compositeDataSet

CompositeDataSet compositeDataSet = new CompositeDataSet(iDataSets) ;

//将compositeDataSet包装为replacementDataSet,便于进行变量替换

ReplacementDataSet replacementDataSet = new ReplacementDataSet(compositeDataSet);

replacementDataSet.addReplacementObject("[NOW]", new Date());

replacementDataSet.addReplacementObject("[UUID]", uuid);

return replacementDataSet;

}

 

具体就不解释了,代码就是最好的注释

 

ReplacementDataSet

通过以上的几个例子就可以看出来,ReplacementDataSet是做文件中变量替换的,它的构造方法是直接以其他dataset为入参的,构造起来非常方便

 

关于dataset的更详细说明,可参考官方文档: http://dbunit.sourceforge.net/components.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值