下記のjarをダウンロードする。(バージョンは必要に応じて読み替える)
なぜか公式サイトにリンクされているSourceForgeからダウンロードできないので、 Maven Repository(http://mvnrepository.com/)のサイトから直接ダウンロードする。("dbunit"で検索)
内部的にslf4jを利用しているため公式サイト(http://www.slf4j.org/)から下記jarもダウンロードする。
Excelを利用する場合、poiのライブラリが必要なため、Apacheのサイト(http://poi.apache.org/)からダウンロードする。
拡張子が「xlsx」のファイルを扱う場合は以下も必要。いずれもpoiをダウンロードすると同梱されている。
まずデータベースにID(id)と名前(name)の2つのカラムを持つsampletblテーブルを作成する(今回はmysqlを使用)。データはまだ入れない。
mysql> create table sampletbl(id int, name varchar(100));
Query OK, 0 rows affected (0.26 sec)
mysql> desc sampletbl;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(100) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.08 sec)
mysql> select * from sampletbl;
Empty set (0.05 sec)
作成したテーブルに投入するテストデータをxmlファイルで用意する。
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<sampletbl id="1" name="Bill" />
<sampletbl id="2" name="Kay" />
</dataset>
タグの名前(sampletbl)がテーブル名、属性名(id, name)がカラム名と紐づいている。またsampletblタグ1つが1レコードとなる。
次にテストクラスを作成する。サンプルでは、xmlデータをDBに投入するところまでのコードを記述する。(テストメソッドのコードは省略)
package test;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;
import org.junit.Test;
public class SampleTest {
@Before
public void setUp() throws Exception {
// ①DBコネクション取得
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/sampledb","userid","password");
IDatabaseConnection dbconn = new DatabaseConnection(conn);
// ②xml用データセット作成
IDataSet dataset = new FlatXmlDataSetBuilder().build(new File("dataset/sampledb.xml"));
// ③データの全削除
DatabaseOperation.DELETE_ALL.execute(dbconn, dataset);
// ④データの挿入
DatabaseOperation.INSERT.execute(dbconn, dataset);
}
@Test
public void test() {
// テストは省略
}
}
[説明]
①DBコネクションの取得
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/sampledb","userid","password");
IDatabaseConnection dbconn = new DatabaseConnection(conn);
DBコネクションはDriverManager.getConnectionで取得する。取得したコネクションはDatabaseConnection(IDatabaseConnectionインタフェースを実装)のコンストラクタの引数に渡す。
②xml用データセット作成
IDataSet dataset = new FlatXmlDataSetBuilder().build(new File("dataset/sampledb.xml"));
DBUnitではテストデータや実際のDBデータをIDataSetで扱う。これをデータセットと呼ぶ。 xmlの場合、FlatXmlDataSetBuilderのbuildメソッドを使ってIDataSetを取得できる。
③データの全削除
DatabaseOperation.DELETE_ALL.execute(dbconn, dataset);
テストは常に同じ状態で実施することが望ましい。よって、データ挿入前に今あるデータをいったん全部削除する。DatabaseOperation.DELETE_ALLのexecuteメソッドを実行するとxmlデータで使用しているテーブルのデータが全て削除される(関係ないテーブルは消さない)。
テーブル内のデータ全削除ではなく、xmlで使用しているデータだけ削除したい場合はDatabaseOperation.DELETEを使う。但し、テーブルにプライマリキーが設定されてなければいけない。削除するデータが特定できないからである。 プライマリキーが無い場合、NoPrimaryKeyExceptionが発生する。
テスト環境に制限がなければDELETE_ALLを使った方が確実なテストができる。
④データの挿入
DatabaseOperation.INSERT.execute(dbconn, dataset);
テストデータファイルのデータをDBへ投入する。DatabaseOperation.INSERTのexecuteメソッドを使う。
データ投入後のテーブルは以下のとおり。これでテストをする準備が完了。(テスト部分のコードは省略)
インサート結果mysql> select * from sampletbl;
+------+------+
| id | name |
+------+------+
| 1 | Bill |
| 2 | Kay |
+------+------+
2 rows in set (0.00 sec)
前述のサンプルはxmlにデータを記述していたが、ExcelやCSVにデータを記述することも可能。まずはExcel。
シート名(sampletbl)がテーブル名、1行目がカラム名(id, name)、2行目以降がデータとなる。
以下テストコード。
package test;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.excel.XlsDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;
import org.junit.Test;
public class SampleTest {
@Before
public void setUp() throws Exception {
// ①DBコネクション取得
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/sampledb","userid","password");
IDatabaseConnection dbconn = new DatabaseConnection(conn);
// ②Excel用データセット作成
IDataSet dataset = new XlsDataSet(new File("dataset/sampletb.xlsx"));
// ③データの全削除
DatabaseOperation.DELETE_ALL.execute(dbconn, dataset);
// ④データの挿入
DatabaseOperation.INSERT.execute(dbconn, dataset);
}
@Test
public void test() {
// テストは省略
}
}
コードはxmlの場合とほぼ一緒。データセットだけExcel用に変更する。Excelの場合、XlsDataSetを使用する。(コード中の②参照)
次にCSV。
id,name
1,Bill
2,Kay
拡張子を抜いたファイル名(smpletbl)がテーブル名、1行目(id, name)がカラム名、2行目以降がデータとする。
CSVの場合、もう1つtable-ordering.txtというファイルが必要。
sampletbl
CSVの場合、ファイル名がテーブル名になるため、xmlやExcelのように複数のテーブルを1つのファイルに記述することができない。そのためtable-ordering.txtというファイルを用意し、このファイルにインサートするテーブル(=ファイル名)を列挙する。列挙した順にインサートされる。
下記の場合、sampletbl、sampletbl2、sampletbl3の3テーブルが存在し、それぞれsampletbl.csv、sampletbl2.csv、sampletbl.3.csvを用意する。
sampletbl
sampletbl2
sampletbl3
最後にテストプログラム。
package test;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.csv.CsvDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;
import org.junit.Test;
public class SampleTest {
@Before
public void setUp() throws Exception {
// ①DBコネクション取得
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/sampledb","userid","password");
IDatabaseConnection dbconn = new DatabaseConnection(conn);
// ②CSV用データセット作成
IDataSet dataset = new CsvDataSet(new File("dataset"));
// ③データの全削除
DatabaseOperation.DELETE_ALL.execute(dbconn, dataset);
// ④データの挿入
DatabaseOperation.INSERT.execute(dbconn, dataset);
}
@Test
public void test() {
// テストは省略
}
}
これもコードはxmlの場合とほぼ一緒。データセットだけCSV用のCsvDataSetに変更する。(コード中の②参照)
CsvDataSetに渡すFileクラスの引数にはファイル名ではなく、table-ordering.txtが存在するフォルダ(上記サンプルの場合datasetフォルダ)を指定する。