技術開発日記

技術やら日々思ったことを綴ってます。

DbUnitとデータ量

DbUnitを使う機会があったので、そのメモ。
ただテスト対象のテーブルのデータが多いせいで元のデータをファイルに一時退避させる処理にすごい時間が掛かってしまい、全然テストができるレベルじゃなかった。
おそらくDbUnitを使うときはデータの少ないテーブルまたは新しくテーブルを作ることができる環境のみでしか適用できないんじゃないかって思う。

なので結局DbUnitは使わず、独自でinsertとdeleteの処理を@Afterと@Beforeで実装する形になってしまった。
これが果たして正しいのかはわからないけど。

あとmaven使っている場合は事前に以下の依存関係を追加。
特に「slf4j」は追加し忘れることが多いので注意。

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.5.6</version>
    </dependency>
    <dependency>
      <groupId>org.dbunit</groupId>
      <artifactId>dbunit</artifactId>
      <version>2.4.8</version>
    </dependency>
public class SampleTest {

    // バックアップ用ファイル
    private File file;

    @Before
    public void setUp()  {

        //現状のDBバックアップを取得
        IDatabaseConnection connection = null;
        try{
            connection = new DatabaseConnection(getConnection());
            QueryDataSet partialDataSet = new QueryDataSet(connection);
            // バックアップを取りたいテーブル名を追加
            partialDataSet.addTable("table-name");
            // バックアップの内容を保存するファイルを生成
            file = File.createTempFile("base", ".xml");
            // 実際にテーブルの内容をファイルに書き込む
            FlatXmlDataSet.write(partialDataSet, new FileOutputStream(file));

            //insertするテストデータのファイルを引数にする。
            IDataSetProducer producer = new FlatXmlProducer(new InputSource(new FileInputStream("insert_data.xml")));
            IDataSet dataSet = new StreamingDataSet(producer);

            /*
             *  対象テーブルのデータをすべて削除したあと、データセットのデータを登録する(DELETE_ALLのあとINSERT)
             *  他にも以下の様なメソッドもある
             *  ・DatabaseOperation.DELETE_ALL 対象テーブルのデータをすべて削除する
             *  ・DatabaseOperation.INSERT   データセットにあるデータを登録する。
             */
            DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);

        } catch (Exception e) {
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
            }
        }
    }

    @After
    public void tearDown() {

        // テストの後かたづけを行う。
        // 対象テーブルのバックアップデータをリストアする。
        IDatabaseConnection connection =null;
        try{
            connection = new DatabaseConnection(getConnection());
            // setUp()で生成したバックアップファイルを引数に再度データをinsert
            IDataSetProducer producer = new FlatXmlProducer(new InputSource(new FileInputStream(file)));
            IDataSet dataSet = new StreamingDataSet(producer);
            DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);

        }catch(Exception e){
        }finally{
            try{
                if(connection != null) {
                    connection.close();
                }
            }catch(SQLException e){
            }
        }
    }
    
    @Test
    public void test() throws DatabaseUnitException, IOException, SQLException {
    
        // テスト対象の実行
        SamplDao dao = new SampleDao;
        dao.insert();

        //実行結果を検証する
        IDatabaseConnection connection = null;
        try{
            // basket_baseテーブルの状態を確認
            connection  = new DatabaseConnection(getConnection());

            IDataSet databaseDataSet = connection.createDataSet();
            ITable actualTable = databaseDataSet.getTable("basket_base");

            // 期待されるデータを取得
            IDataSetProducer producer = new FlatXmlProducer(new InputSource(new FileInputStream("src/test/expected_basket_base_data.xml")));
            IDataSet expectedDataSet = new StreamingDataSet(producer);
            ITable expectedTable = expectedDataSet.getTable("basket_base");

            // 比較する
            assertEquals(expectedTable, actualTable);
        }finally{
            if(connection!=null) {
                connection.close();
            }
        }
   }
}