单元测试---dbunit数据集的选择与使用
对于增删改方法的单元测试,推荐使用dbunit+springtestdbunit的方式编写单元测试。
我们使用connection.createDataSet()生成IDataSet对象,利用IDataSet对象生成我们需要的数据集文件,
dbunit支持多种数据集,查看dbunit.jar源码可以看到,在org.dbunit.dataset包下,有生成数据集的工具
类,
dbunit支持以下几种常用的数据集:
- csv格式 使用csv/CsvDataSetWriter生成数据集
- excel 使用excel/XlsDataSet生成数据集
- xml 使用xml/XmlDataSet生成数据集
- flatxml 使用xml/FlatXmlDataSet生成数据集
导出数据集可参考下面代码,(除了导出数据集,我们还可以导出表结构的DTD文件)
Connection jdbcConnection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8",
"username", "password");
IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);
connection.getConfig().setProperty(DatabaseConfig.PROPERTY_ESCAPE_PATTERN , "`?`");
IDataSet fullDataSet = connection.createDataSet();
// write DTD file
FlatDtdDataSet.write(fullDataSet, new FileOutputStream("D:/dev/source/test.dtd"));
// write flatxml database export
FlatXmlDataSet.write(fullDataSet, new FileOutputStream("D:/dev/source/full_flat.xml"));
// write xml database export
XmlDataSet.write(fullDataSet, new FileOutputStream("D:/dev/source/full_xml.xml"));
//write csv database export
CsvDataSetWriter.write(fullDataSet,new File("D:/dev/source/full_csv"));
//write excel database export
XlsDataSet.write(fullDataSet, new FileOutputStream("D:/dev/source/full_excel.xls"));
dbunit默认使用的数据集是FlatXmlDataSet,springtestdbunit基于dbunit,所以也是如此,
springtestdbunit默认使用的是com.github.springtestdbunit.dataset.FlatXmlDataSetLoader进行数据集
的载入,下一篇文章中,我会对使用springtestdbunit及载入数据进行说明。
FlatXmlDataSet对应的XML例如:
<dataset>
<Person Name="Jade" Age="30"/> <Person Name="Kirin" Age="31" Location="Beijing"/>
</dataset>
使用这种数据集有一个问题:如果数据库中某一条字段为null,在flat XML中将不会显示该attribute。
FlatXmlDataSet用XML文件中该表的第一行数据来制定表的结构。因此,如果数据库中某个字段所有记录不
都为null,但恰巧第一条记录为null,那么这个字段插入后将会全部为空,因为第一行指定的表结构中没有这
个字段。例如上面的XML文件,第一条的Location为null,第二条有值,但是,导入数据库后,数据库中两
条记录的Location字段全部为null。有很多人说,只要把不为空的记录放到第一行就可以了,我觉得这并不
是最好的解决办法,因为这需要我们费力去寻找一条所有字段都有值的记录,并且如果表里没有这种记录
呢,比如表里有这样两个字段,一个字段为空另一个字段就一定有值,另一个字段为空,这个字段才有值,
如果存在这种互异的字段,那么数据集的导入便完全无法正确的进行了,使用flat xml插入后的数据一定有一
列全部为空。解决办法是不使用默认的FlatXml数据集,可以尝试使用其他三种,我们这里使用XmlDataSet
演示,其他两种,读者可自行测试。
使用XmlDataSet生成的XML文件如下所示:
<dataset>
<table name="Person">
<column>Name</column>
<column>Age</column>
<column>Location</column>
<row>
<value>Jade</value>
<value>30</value>
<null/>
</row>
<row>
<value>Kirin</value>
<value>31</value>
<value>Beijing</value>
</row>
</table>
</dataset>
附:
- dbunit的使用,可以参考http://www.cnblogs.com/kirinboy/archive/2012/06/06/integration-testing-with-dbunit.html
- FlatXml导出数据集的“第一行”问题,http://www.blogjava.net/iamlibo/archive/2008/12/09/245335.html这里有详细的描述
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。