目次へ

6.2 カラムの選択

テスト結果を検証する際、必要のないカラムを除きたい場合があります。例えば、Imageテーブルに以下のようにカラムを追加します。

カラム  データ型  P  NN  内容 
imageid integer *   ID(プライマリキー)
image bytea     画像データ
insertdate timestamp   * データ挿入日。defaultでデータ挿入日時が登録される。

Javaクラスのテストを行う場合、insertdateの値に関して検証を行う必要はありません。そこで、期待されるテーブルの状態を表すXMLとして以下のファイルを用意します。ImageクラスとImageManagerクラスは、6.1で示したものと同じものを使用します。

image_data.xml
<dataset> 
  <!-- insertdateは検証の必要がないため、省く -->
 <image imageid="1" image="test.gif" />
 <image imageid="2" image="test2.gif" />
</dataset>

テストでは、実際のimageテーブルの状態がimage_data.xmlの内容と一致するか、検証します。

ImageManagerTest.java (抜粋)
       IDatabaseConnection connection = null;
        try {
            // imageテーブルの状態を確認
            Connection conn = getConnection();
            connection = new DatabaseConnection(conn);

            IDataSet databaseDataSet = connection.createDataSet();
            ITable actualTable = databaseDataSet.getTable("image");

            // 期待されるデータを取得
            IDataSet expectedDataSet = new FlatXmlDataSet(new FileInputStream("image_data2.xml"));
            ITable expectedTable = expectedDataSet.getTable("image");

            // 比較する
            Assertion.assertEquals(expectedTable, actualTable);
        } finally {
            if (connection != null)
                connection.close();
        }

しかし、テストクラスを実行すると以下のようなエラーになります。

junit.framework.AssertionFailedError: column count (table=image) expected:<2> but was:<3>

検証したいカラム数はimageidとimageの2つだけなのですが、実際のテーブルのカラム数が3であるため、例外がスローされます。このようにexpectedTableで定義されているカラムのみを検証したい場合、以下のようにフィルターを使用します。

ITable filteredTable 
      = DefaultColumnFilter.includedColumnsTable(actualTable, 
                                                 expectedTable.getTableMetaData().getColumns());
Assertion.assertEquals(expectedTable, filteredTable); 

DbUnitではFilter機能を使用し、カラムを取捨・選択してITableを作成することが可能です。上のサンプルコードではDefaultColumnFilterを使用し、actualTableよりexpectedTableがもつカラムのみを抽出しています。

ただし、上のコードは「expectedTable」でDTDを指定している場合はうまく動作しません。DTDを指定している場合、Filterを「expectedTable」と「actualTable」の両方のテーブルに適用する必要があります。

ITable filteredExpectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable,
                                                                        new String[]{"insertdate"});
ITable filteredActualTable = DefaultColumnFilter.excludedColumnsTable(actualTable,
                                                                      new String[]{"insertdate"});
Assertion.assertEquals(filteredExpectedTable, filteredActualTable);

上のコードでは、DefaultColumnFilterのexcludedColumnsTableメソッドを使用し、検証対象より「insertdate」カラムを除いています。

実習課題3

Imageテーブルにカラムを追加します。実習課題1で作成したImageManagerのテストクラスを修正し、テストが通るようにしなさい。

  • Imageクラス、およびImageManagerクラスは変更しない。
  • insertdateの値について、検証しなくてよい。

実習課題4

実習課題3で作成したテストデータを表すXMLファイルにDTDを指定しなさい。DTDを指定してもテストをパスするよう、ImageManagerのテストクラスを修正しなさい。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp