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のテストクラスを修正しなさい。