事の起こり
テストをしないでいることに耐えられず、むしゃくしゃしてやった。
反省はしているが後悔はしていない。
各種ダウンロード
- Pleiades All in One(Eclipse 4.4 Luna)1
- 諸般の事情によりUltimate Full Edition
- MySQL用のJDBCドライバ2
- Platform Independent-ZIP Archiveをダウンロード
- このサイト3の下半分を参考にした
- JUnit/DBUnit関係のライブラリ
- ここ4を見ながらやればOK
- 取得したjarファイルは基本的にpleiades/eclipse/pluginsフォルダに入れて、プロジェクトごとにビルドパスを通している
- もっとうまいやり方があるのかもしれないのであとで探す
データベースの準備
- pleiades/xamppにあるsetup_zampp.batを実行
- zampp_control.exeを起動(英語指定)
- Apache→MySQLの順で起動
- MySQLの横にあるAdminをクリックするとphpMyAdmin起動
- 「データベース」>「データベースを作成する」で適当な名前のデータベースを作成
- 照合順序はutf8_unicode_ciにしておいた
- 作成したデータベースに適当なテーブルを作る
- DBUnitでデータを入れるので、中身は空でOK
テスト対象のクラスを用意
データベースに接続
public static Connection getConnection() throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test","user","pass");
return conn;
}
こんな感じのメソッドを作っておく(例外は適当)。
localhostの後ろのtestはデータベース名。
userとpassはこのあたり5を見ながら編集する。
その他
-
PreparedStatementのプレースホルダにCalendar型の値を入れようとして躓いた
- date_format(?,'%Y/%m/%d')と置換え、PreparedStatement#setStringメソッドを使った
- 何か思い違いをしているような気がする
-
今回はselect文のみのテストだったのでcommitとかrollbackとかは特に何もしていない(後でやる)
テスト用のデータを作る
プロジェクト直下にdatasetフォルダを作り、そこにcsvファイルとtable-ordering.txtを置いた
csvファイル
- ファイル名がテーブル名になる
- 1行目がカラム名、2行目以降にデータを書く
- 日付は「2015/03/27」ではなく「2015-03-27」と表記する
- セルの書式設定でテキストを指定する
table-ordering.txt
- 拡張子を除いたファイル名を1行に1つ書く
- 書いた順にinsertされるので、外部参照等があるときは順番に気をつける
テストクラスを作る
@Before
public void setUp(){
try(Connection conn = getConnection()) {
IDatabaseConnection dbconn = new DatabaseConnection(conn);
IDataSet dataset = new CsvDataSet(new File("./dataset"));
DatabaseOperation.CLEAN_INSERT.execute(dbconn, dataset);
} catch (SQLException | DatabaseUnitException e) {
e.printStackTrace();
} finally {
if(dbconn != null){
try {
dbconn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
通常のテストクラスにこんな感じのメソッドを追加する。
getConnecionメソッドはさっき書いたやつ。
IDatabaseConnectionはAutoCloseableじゃなかったので手作業で閉じる。
データベースに接続して、テーブルをきれいにした後csvファイルの中身を流し込んでいる。らしい。
必要であればtearDownでDatabaseOperasion.DELETE等を実施する。
今回はselect文のみ かつ テスト対象メソッドは「条件に合致する行の有無」を見てbooleanを返すだけなのでデータが入っていればよしとした。