1

データベース(MySQLの自動インクリメント列など)によって生成されたIDをアサートするためにDbUnitを使用する方法のアイデア/ヒントが必要です。私には非常に単純なケースがありますが、現時点では問題があります。

2つのテーブル:mainおよびrelatedmain.id列は自動インクリメントです。関連するテーブルには外部キーがあります:related.main_id-> main.id。私のテストケースでは、アプリケーションは両方のテーブルに複数のエントリを挿入するため、データセットは次のようになります。

<dataset>
    <main id="???" comment="ABC" />
    <main id="???" comment="DEF" />

    <related id="..." main_id="???" comment="#1 related to ABC" />
    <related id="..." main_id="???" comment="#2 related to ABC" />
    <related id="..." main_id="???" comment="#3 related to DEF" />
    <related id="..." main_id="???" comment="#4 related to DEF" />
</dataset>

順序として、挿入がどのように実行されるかは不明です-テストの前にテーブルを単純にクリア/切り捨てて、事前に事前定義されたIDを使用することはできません(たとえば、「ABC」エントリが最初に来るので、ID1と「DEF」を2番目に取得します--gets 2)。私がそのようにテストを書くと(これは間違っているでしょう)、運が良ければうまくいくこともあれば、うまくいかないこともあります。

そのようなケースをテストするためのクリーンな方法はありますか?エントリがDBで適切に作成およびリンクされていることを表明したいので、エントリが存在するだけではありません(自動インクリメント列を単に無視する場合)。

4

2 に答える 2

2

質問のコメントに基づいて、私は自分の質問に答えているので、同様の解決策を探している他の人に役立つかもしれません。

結局、生成された ID のアサートはスキップしました。実際にチェックしたかったのは、mainrelatedテーブルの間のエントリが「適切にリンクされている」ことです。これを実現するために、単体テストではクエリを使用してデータセットを作成し、両方のテーブルを結合しました。

SELECT main.comment, related.comment AS related_comment 
FROM main, related 
WHERE main.id = related.main_id

次に、このクエリによって生成されたデータセットが静的に定義されたデータセットと一致することをアサートします。

<dataset>
     <result comment="ABC" related_comment="#1 related to ABC" />
     <result comment="ABC" related_comment="#2 related to ABC" />
     <result comment="DEF" related_comment="#3 related to DEF" />
     <result comment="DEF" related_comment="#4 related to DEF" />
</dataset>

データセットが一致している場合、エントリが「適切にリンクされている」と想定できます。

于 2014-03-16T10:57:52.083 に答える
0

たぶん、dbunitにテーブルを自動的にソートさせ、テーブルmainをソートさせます。行の絶対数が有利にわかっているので、これで問題が解決するはずです。idrelatedid

DBUnitを使用すると、org.dbunit.dataset.SortedTable.SortedTableを使用して並べ替えることができます。この表には、並べ替える必要のある列のリストが必要です。SortedTableのJavaDoc

于 2012-11-20T06:45:07.573 に答える