如何在DBUnit中创建与初始数据集表名相同的XML数据集及代码问题
解决DBUnit中创建同名表XML数据集的问题
看起来你是想用DBUnit加载多个XML数据集,但遇到了表名重复的问题对吧?默认的CompositeDataSet不允许添加包含同名表的数据集,会直接抛出异常。下面给你两种常用的解决方案,根据你的需求选择即可:
方案1:合并同名表的数据(推荐)
如果你想把两个XML里同表的数据合并到一起(比如两个文件都有product_upc表,要把两行数据合并成一个完整表),直接把CompositeDataSet换成MergeDataSet就行——这个类就是专门用来合并同名表数据集的:
public function getDataSet() { // 替换为MergeDataSet实现同名表数据合并 $primary = new \PHPUnit\DbUnit\DataSet\MergeDataSet(); $fixturePaths = [ "test/Seeds/Upc/DB/UpcSelect.xml", "test/Seeds/Generic/DB/ProductUpcSelect.xml" ]; foreach($fixturePaths as $fixturePath) { $dataSet = $this->createXmlDataSet($fixturePath); $primary->addDataSet($dataSet); } return $primary; }
它会自动遍历所有添加的数据集,把同名表的行数据合并到同一个表中,不会因为表名重复报错。注意要保证两个XML里的同表结构一致(列名、数据类型匹配),不然可能会出现数据加载异常。
方案2:用后加载的数据集覆盖同名表
如果你的需求是后面的XML数据集完全替换前面的同表数据(比如第二个文件的product_upc表要覆盖第一个里的内容),可以手动处理表的添加和移除:
public function getDataSet() { // 先加载基础数据集 $baseDataSet = $this->createXmlDataSet("test/Seeds/Upc/DB/UpcSelect.xml"); // 加载用来覆盖的数据集 $overrideDataSet = $this->createXmlDataSet("test/Seeds/Generic/DB/ProductUpcSelect.xml"); $combinedDataSet = new \PHPUnit\DbUnit\DataSet\CompositeDataSet(); // 先添加基础数据集 $combinedDataSet->addDataSet($baseDataSet); // 遍历覆盖数据集的所有表,替换掉基础里的同名表 foreach ($overrideDataSet->getTables() as $table) { $tableName = $table->getTableName(); if ($combinedDataSet->getTable($tableName)) { // 移除原有表 $combinedDataSet->removeTable($tableName); } // 添加新表 $combinedDataSet->addTable($table); } return $combinedDataSet; }
这种方式会让后加载的表完全替换掉之前的同名表,适合需要覆盖初始数据的场景。
另外再提一句,你的XML数据集格式要符合DBUnit的要求,比如每个表的行用标签表示,列作为属性:
<dataset> <upc id="1" code="UPC001" /> <product_upc id="1" upc_id="1" product_id="100" /> </dataset>
内容的提问来源于stack exchange,提问作者Allenph
相关产品推荐
相关产品推荐

