我正在尝试将我的单元测试环境设置为使用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/

10-12 03:00