5. データセット(2)
- 5.1. ReplacementDataset
- 5.2. CompsiteDataSet
- 5.3. QueryDataSet、DatabaseConnection
- 5.4. XlsDataset
4章に引き続き、5章でもさまざまなデータセットについて説明します。
5.1 ReplacementDataset
従業員情報を表すemployeeテーブルがあったとします。e_numテーブルのプライマリキー「e_num」をserial型にします。e_numの値は挿入時にシーケンスが自動採番します。
カラム名 | データ型 | P | NN | 内容 |
---|---|---|---|---|
e_num | serial |
*
|
*
|
従業員番号 |
name | varchar(20) | 従業員名 |
従業員を表すクラスは以下のよういなります。
EmployeeBean.java
public class Employee{ private Integer e_num; private String name; //setterとgetterがある。 }
EmployeeBeanクラスには、employeeテーブルにデータを挿入するinsertメソッドを追加します。insertメソッドは、e_numカラムに挿入する値をメソッド実行時にその都度シーケンスから取得します。また、insertメソッド実行後には、シーケンスにより割り振られた番号がe_numフィールドに設定されるようにしましょう。
それでは、insertメソッドのテストはどのように作成すればよいでしょうか?テストメソッドでは、「メソッド実行後のテーブルデータ」を表すXMLファイルを作成する必要があります。しかしe_numの値はメソッド実行時に決まるため、テストプログラム作成時にテストデータとしてe_numを指定することができません。
<!-- e_numは5004になるかどうかわからない。そのため、このようなテストデータを用意してもエラーになる--> <employee e_num="5004" name="山田 花子"/>
このような場合に、ReplacementDataSetを使用すると便利です。ReplacementDataSetを利用すれば、データセットの特定の値を置換することができます。このケースでは、e_numカラムの値がinsertメソッドを実行するまでわかりません。そのため、変化するかもしれないe_numの値に仮に"[E_NUM]"という文字列を設定しておきます。
employee_after_insert.xml
<employee e_num="[E_NUM]" name="山田 花子"/>
次にテストメソッド内で「メソッド実行後のテーブルデータ」を作成します。
EmployeeBeanTest.java
... EmployeeBean employee=new EmployeeBean(); employee.setName("山田 花子"); employee.insert(); //insertメソッドを実行すると、o_numフィールドに設定される。 ReplacementDataSet expectedDataSet = new ReplacementDataSet(new FlatXmlDataSet(new FileInputStream("employee_after_insert.xml"))); expectedDataSet.addReplacementObject("[E_NUM]", employee.getE_num()); ...
insertメソッド実行後、まず、employee_after_insert.xmlを読み込み、ReplacementDataSetを生成しています。ReplacementDataSetには引数ひとつのコンストラクタが存在します。引数にはIDataSetを指定します。引数に指定したデータセットの特定のデータを置換して、新たなデータセットを作成します。
置換を実行するには、addReplacementObjectメソッドを使用します。一つ目の引数で指定した文字列を、2つ目の引数で指定したObjectで置換します。ここれは、データセット内の"[E_NUM]"という文字列を新しい従業員番号の値で置換しています。これで、いつでもexpectedDataSetは「メソッド実行後のテーブルデータ」と一致するはずです。
実習課題1
- EmployeeBeanのinsertメソッドを実装しなさい。
- DbUnitを使用し、inertメソッドのテストメソッドを作成し、実行しなさい。
- テストメソッドは繰り返し実行できることを確認しなさい。