我正在尝试将我的单元测试环境设置为使用DbUnit。
我遇到了一些问题,因为我要控制的表没有主键。我已经收到了org.dbunit.dataset.NoPrimaryKeyException
。
我已经按照这里http://dbunit.wikidot.com/noprimarykeytable的步骤操作,但是我该如何使用:
connection.getConfig().setProperty("http://www.dbunit.org/properties/primaryKeyFilter", new MyPrimaryKeyFilter("A1"));
为我的每张桌子?
例如,我有以下数据库:
CREATE TABLE `NO_PK1` (
`A1` int(11) NOT NULL,
`A2` varchar(50) default NULL
);
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<NO_PK1 A1="1" A2="Test1" />
<NO_PK1 A1="2" A2="Test2" />
<NO_PK1 A1="3" />
</dataset>
CREATE TABLE `NO_PK2` (
`B1` int(11) NOT NULL,
`B2` varchar(50) default NULL
);
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<NO_PK2 B1="1" B2="Test1" />
<NO_PK2 B1="2" B2="Test2" />
<NO_PK2 B1="3" />
</dataset>
CREATE TABLE `NO_PK3` (
`C1` int(11) NOT NULL,
`C2` varchar(50) default NULL
);
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<NO_PK3 C1="1" C2="Test1" />
<NO_PK3 C1="2" C2="Test2" />
<NO_PK3 C1="3" />
</dataset>
如何在这种情况下重写
connection.getConfig().setProperty("http://www.dbunit.org/properties/primaryKeyFilter", new MyPrimaryKeyFilter("A1"));
?非常感谢您的任何建议。
最佳答案
您需要确保MyPrimaryKeyFilter处理架构中的所有表。在该示例中,只有一个表,因此提供的简单过滤器类可以正常工作。在您的情况下,我可能会更改该类以采用包含表的Map-> pk列名称映射:
class MyPrimaryKeyFilter implements IColumnFilter {
private Map<String, String> pseudoKey = null;
MyPrimaryKeyFilter(Map<String, String> pseudoKey) {
this.pseudoKey = pseudoKey;
}
public boolean accept(String tableName, Column column) {
return column.getColumnName().equalsIgnoreCase(pseudoKey.get(tableName));
}
}
然后使用{NO_PK1-> A1},{NO_PK2-> B1}和{NO_PK3-> C1}条目设置 map 。
关于java - 将DbUnit与没有主键的表一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9131033/