关于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