DBUnit 4章 データセット(1)
- 4.1. IDataSet
- 4.2. FlatXmlDataSet
- 4.3. FlatXmlDataSetとDTD
- 4.4. DTDの生成
4.3 FlatXmlDataSetとDTD
ところで、FlatXmlDataSetではXML見てテーブルの構造を判断しています。例えば、4.2のsample_data.xmlを読み込んだ場合、「TEST_TABLEはCOL0、COL1、COL2の3つのカラムを持つテーブル」とみなされます。それでは、XMLを以下のように変更したらどうなるでしょう。
sample_data2.xml
<dataset> <TEST_TABLE COL1="row 1 col 1"/> <TEST_TABLE COL0="row 0 col 0" COL1="row 0 col 1" COL2="row 0 col 2"/> <SECOND_TABLE COL0="row 0 col 0" COL1="row 0 col 1" /> </dataset>
TEST_TABLE 要素を入れ替えました。 上述している通り、FlatXmlDataSetは、TEST_TABLEテーブルがどのようなカラムを持つかを「最初のTEST_TABLE要素の属性」で判断します。 ですから、sample_data2.xmlを読み込んだ場合、「TEST_TABLEはCOL1カラムを1つだけ持つテーブル」とみなされます。 よって、3行目で、COL0やCOL2の属性を指定しても全て無視されてしまいます。
このような事態は、テーブルの構造を表すDTDを作成し指定すれば解決します。例えば、以下のようなDTDを作成します。
sample_table.dtd
<!ELEMENT dataset ( TEST_TABLE*, SECOND_TABLE*, EMPTY_TABLE*)> <!ELEMENT TEST_TABLE EMPTY> <!ATTLIST TEST_TABLE COL0 CDATA #IMPLIED COL1 CDATA #REQUIRED COL2 CDATA #IMPLIED > <!ELEMENT SECOND_TABLE EMPTY> <!ATTLIST SECOND_TABLE COL0 CDATA #REQUIRED COL1 CDATA #IMPLIED >
このDTDでは、TEST_TABLE要素が3つの属性を持つことを示しています。そして、データセットを表すXMLで上のDTDを指定します。
sample_data2_with_dtd.xml
<!DOCTYPE dataset SYSTEM "sample_table.dtd"> <dataset> <TEST_TABLE COL1="row 1 col 1"/> <TEST_TABLE COL0="row 0 col 0" COL1="row 0 col 1" COL2="row 0 col 2"/> <SECOND_TABLE COL0="row 0 col 0" COL1="row 0 col 1" /> </dataset>
DTDを指定することにより、COL0、COL1、COL2の3つのカラムにデータを持つデータを作成することができます。FlatXmlDataSetでXMLを出力する場合に、DOCTYP宣言も出力する場合は、以下のように「setDocType()」メソッドを使用します。
FlatXmlWriter datasetWriter = new FlatXmlWriter( new FileOutputStream("dataset.xml")); datasetWriter.setDocType("dataset.dtd"); datasetWriter.write(dataSet);
実習課題1
2章の実習課題2を修正しなさい。
- Customerテーブルにofficeカラムがnullのデータを追加する。
- CustomerBeanのテストクラスに、loadByC_numメソッドでofficeカラムがnullのデータも取得できるか確認するメソッドを追加する。
- テストデータ(を表すXML)には、DTDを指定する。
- DTDを指定しなかった場合に、不具合が発生することを確かめる。
実習課題2
バックアップでDOCTYPE宣言を出力するように変更せよ。