1

現在、アプリケーションのテストを作成する必要があります。これを実現するために「dbunit」を使用しましたが、2つのデータセットを比較する必要があります。

1)QueryDataSetで取得したデータベースからのレコード
2)期待される結果は、データセットとして読み込んだファイルの適切なFlatXMLに書き込まれます。

基本的に、2つのデータセットをこの方法で比較できます。

ここで問題となるのは、タイムスタンプのある列です。それらは、期待されるデータセットと一致することはありません。それらを比較するとき、私は本当にそれらを無視したいのですが、それは私が望むようには機能しません。

列フィルターとignoreColumnsを追加して各テーブルを比較すると、機能します。ただし、このアプローチは非常に面倒です。その比較では多くのテーブルが使用され、非常に多くのコードを追加する必要があるため、最終的には肥大化します。null値を持つフィールドにも同じことが当てはまります

また、すべてのテーブルの最初の列のみを比較する機会があった場合、考えられる解決策は、列名ではなく、列インデックスのみで名前を付けることです。しかし、私が見つけることができるものは何もありません。

何かが足りないのかもしれませんし、各テーブルを比較する以外の方法で機能しないのかもしれません。

4

2 に答える 2

3

完了するために、いくつかの追加情報を投稿する必要があります。実際、データベースからデータを読み取るプロセスが私を閉じ込めたため、以前に投稿したソリューションはまったく機能しません。

「QueryDataset」を使用するプロセスは、データベースからデータを読み取り、データセットとして保存しましたが、このデータセットからデータにアクセスできなくなりました(デバッグモードでデータを表示できましたが)。代わりに、操作全体がorg.dbunit.database.ForwardOnlyResultSetTable.getRowCount(ForwardOnlyResultSetTable.java:73)でUnsupportedOperationExceptionで失敗しました。

失敗を生成するサンプルコード:

QueryDataSet qds = new QueryDataSet(connection);
qds.addTable(“specificTable”);
qds.getTable(„specificTable“).getRowCount(); 

この方法で試してみても失敗します。

IDataSet tmpDataset = connection.createDataSet(tablenames);
tmpDataset.getTable("specificTable").getRowCount();

抽出を機能させるには、次の行(2番目の行)を追加する必要があり
ます。IDataSettmpDataset = connection.createDataSet(tablenames);
IDataSet actualDataset = new CachedDataSet(tmpDataset);

素晴らしい、これはどこにも文書化されていませんでした...

しかし、それだけではありません。「QueryDataSet」を実行した後でも、この行を追加できると思うでしょう...しかし、そうではありません。これはまだ機能しません!それでも同じ例外がスローされます!それは私には意味がなく、私はそれで多くの時間を無駄にしました...

xmlファイルから読み込まれたデータセットからのデータの抽出は問題なく機能することに注意してください。この煩わしさは、データベースから直接データセットを取得しようとしたときに発生します。

上記を実行した場合は、以下のように続行できます。これにより、予想されるxmlファイルで取得した列のみが比較されます。

    // put in here some code to read in the dataset from the xml file...
    // and name it "expectedDataset"
    // then get the tablenames from it...
    String[] tablenames = expectedDataset.getTableNames();

    // read dataset from database table using the same tables as from the xml
    IDataSet tmpDataset = connection.createDataSet(tablenames);
    IDataSet actualDataset = new CachedDataSet(tmpDataset);

    for(int i=0;i<tablenames.length;i++)
    {
        ITable expectedTable = expectedDataset.getTable(tablenames[i]);
        ITable actualTable = actualDataset.getTable(tablenames[i]);         
        ITable filteredActualTable = DefaultColumnFilter.includedColumnsTable(actualTable, expectedTable.getTableMetaData().getColumns());
        Assertion.assertEquals(expectedTable,filteredActualTable);
    }
于 2012-09-21T12:57:42.267 に答える
0

次の形式を使用することもできます。

// Assert actual database table match expected table
String[] columnsToIgnore = {"CONTACT_TITLE","POSTAL_CODE"}; 
Assertion.assertEqualsIgnoreCols(expectedTable, actualTable, columnsToIgnore);
于 2013-06-25T13:15:31.617 に答える