如何在DBUnit的IDataSet中使用两个不同数据表?附单表示例
嘿,这个问题其实挺常见的,DBUnit提供了几种简单的方式来加载多个数据表,我给你两种最常用的方案:
方案1:将多个数据表定义在同一个XML文件中
你目前用的FlatXmlDataSet本身就支持在单个XML文件里包含多个数据表,只需要在XML中为每个表添加对应的<table>节点就行,代码几乎不用改。
举个例子,你的dataSet.xml可以改成这样:
<?xml version='1.0' encoding='UTF-8'?> <dataset> <!-- 第一个表:group --> <table name="group"> <column>id</column> <column>name</column> <row> <value>1</value> <value>管理员组</value> </row> <row> <value>2</value> <value>普通用户组</value> </row> </table> <!-- 第二个表:user --> <table name="user"> <column>id</column> <column>username</column> <column>group_id</column> <row> <value>1</value> <value>admin</value> <value>1</value> </row> <row> <value>2</value> <value>user1</value> <value>2</value> </row> </table> </dataset>
然后你的代码完全可以保持原来的样子,DBUnit会自动识别并加载这两个表:
@Override protected IDataSet getDataSet() throws Exception { return new FlatXmlDataSetBuilder().build(loadFile("dao/group/dataSet.xml")); }
这种方式适合数据表之间有关联,或者你希望把相关数据放在同一个文件里维护的场景。
方案2:使用CompositeDataSet组合多个独立的DataSet
如果你的两个数据表数据分别放在不同的XML文件里(比如group-data.xml和user-data.xml),可以用DBUnit的CompositeDataSet把多个单独的IDataSet实例组合起来。
代码示例如下:
@Override protected IDataSet getDataSet() throws Exception { // 加载第一个数据表的DataSet IDataSet groupDataSet = new FlatXmlDataSetBuilder().build(loadFile("dao/group/group-data.xml")); // 加载第二个数据表的DataSet IDataSet userDataSet = new FlatXmlDataSetBuilder().build(loadFile("dao/user/user-data.xml")); // 组合两个DataSet return new CompositeDataSet(groupDataSet, userDataSet); }
这种方式的好处是可以把不同表的测试数据分开管理,尤其是当表数据量比较大或者维护频率不同的时候,会更清晰。
需要注意的是,CompositeDataSet会自动处理表之间的顺序(比如外键依赖的表会先加载),不过如果你需要严格控制加载顺序,可以用带顺序参数的构造方法:
return new CompositeDataSet(new IDataSet[]{groupDataSet, userDataSet}, true);
第二个参数true表示保持传入的DataSet顺序。
内容的提问来源于stack exchange,提问作者Filipp Berzenin
相关产品推荐
相关产品推荐

