LoginSignup
12
13

More than 5 years have passed since last update.

eclipse + MySQL + JUnit + DBUnit で単体テスト

Last updated at Posted at 2015-03-28

事の起こり

テストをしないでいることに耐えられず、むしゃくしゃしてやった。
反省はしているが後悔はしていない。

各種ダウンロード

  • 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を返すだけなのでデータが入っていればよしとした。

参考

12
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13