2012-02-03 26 views
6

DbUnitを使用するためにユニットテスト環境を設定しようとしています。プライマリキーを持たないテーブルで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"));を書き換える方法を教えてください。何かアドバイスのため

感謝します。

答えて

5

MyPrimaryKeyFilterがスキーマ内のすべてのテーブルを処理することを確認する必要があります。この例では、テーブルが1つしかないので、提供される単純なフィルタクラスがうまく動作します。あなたのケースでは、私はおそらく、テーブルを含む地図取るために、そのクラスを変更します - > 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}のエントリ。

+0

ありがとうスシ。それは理にかなっている。テーブルの1つに複数のフィールドで構成されるキーがある場合はどうなりますか? – mip

+1

私はそこにマップを>に変更して、内容をチェックすることができると思います。 – slushi

+0

したがって、return文は 'return pseudoKey.get(tableName).contains(column.getColumnName());'になります。 – mip

3

私は同じ問題とこれらのブログで見つけソリューションに分類されます。すべてのブログの著者は、このコードが示すhttp://dbunit.wikidot.com/noprimarykeytable

から開始

異なるIDをチェックする戦略:

関連する問題