MoChiwakiブログ

女性エンジニアがゆる~く書く備忘録ブログ 〜だいたいいつもつまづいている〜

DBUnit使ってみた件

今までテストといえばJUnitだけでしたが
最近はDBと接続するDAOメソッドもテスト
しています。

少し前の案件では無理やりJUnitでテスト用の値を入れて、
それからその情報を消してー
ってやっていたこともありました。

確かに

それでもできるが、

だがしかし!

そんな面倒なことを
するのはいやなんす!
どんだけのコード量になんねん!!

ということで

DBUnit

まずはjarを入れます。
入れるのは

  • JUnit のjar
  • DBUnit のjar
  • slf4j だったかな? のjar
  • poi のjar

ちなみに私はExcelで比較しかったからpoi使ったらそこで引っかかった。
なんかversionによって違うみたいで
私は3.2のFinalにして動いた!

  protected void setUp() {
    IDatabaseConnection connection =null;
    try{
        super.setUp();

        Connection conn = getConnection();
        connection = new DatabaseConnection(conn);
 
        //現状のバックアップを取得
        QueryDataSet partialDataSet = new QueryDataSet(connection);

        // バックアップを取りたいテーブルを指定する
        partialDataSet.addTable("DbUnitTable");
        
        // defaultとして入れたいデータの挿入
        file = File.createTempFile("dbUnitTest",".xls");
        FlatXmlDataSet.write(partialDataSet, new FileOutputStream(file));
 
        //テストデータを投入する
        IDataSet dataset = new XlsDataSet(new File("import.xls"));        DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);
 
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        try{
            if(connection!=null) connection.close();
        }catch(SQLException e){}
    }
}
    
    

SetUpメソッドしてはこのように

  • Connectionする
  • データ消えたら困るからバックアップとっとく
  • デフォルト値として入れたいものをExcelファイルとして保存
  • そのExcelファイルをセット

Afterメソッドとしては

  • Connection閉じる
  • IDatabaseConnectionを閉じる

Excelとしては
シート名がテーブル名
上の行がカラム名
sheet名 DbUnitTable としましょう!

ID PASSWORD NAME
1 pass1 MoChi
2 pass2 Kome

例えばこのデータをテスト用として入れます。
そしてそれからえっとあの、
例えば

SELECT name FROM DbUnitTAble WHERE id = 1;

こんなSQLを動かすようなメソッド
DaoのgetNameメソッドがあるとしよう。
その戻り値がヒットしたところのnameを取ってくる
その答えは Mochi ですね?

そしてそのメソッドテストとしては
こんな感じす

public static class DAOTest{
  @Test
  public void DAOクラスのテスト(){
    Dao dao = new Dao();
    String actual = dao.getName(1);
    String expected = "MoChi";
    
    assertEquals(actual, expected);
  }
}

JUnitでやるようにテストするわけですわ。

だがしかし!

SQLUPDATEとか、INSERTDELETEされてしまったら…!

そのときはそのとき。
その変化した結果をまた新しいExcelとかで
IDataSetに入れるという行為をします。

何だ楽勝じゃんとか思うじゃん、
でもSQLのせいかな?わかんないけど、
データの並び方違ってっからエラー出るんすわ。

ちょっとめんどくさい--
だから私はわざわざ2重ループ回して比較したっていう。。

そのコードをここに保存したい!

だがしかし!

そのコード、会社のPC見ないとわからないから
今日のところはこれで終了 笑

あ。最後に、ちなみに、上のコードはコンパイルしてないので
間違っている可能性もあるかもです。
すみませんーー