DBUnit使ってみた件
今までテストといえばJUnitだけでしたが
最近はDBと接続するDAOメソッドもテスト
しています。
少し前の案件では無理やりJUnitでテスト用の値を入れて、
それからその情報を消してー
ってやっていたこともありました。
確かに
それでもできるが、
だがしかし!
そんな面倒なことを
するのはいやなんす!
どんだけのコード量になんねん!!
ということで
DBUnit
まずは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メソッドしてはこのように
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でやるようにテストするわけですわ。
だがしかし!
SQLでUPDATEとか、INSERT、DELETEされてしまったら…!
そのときはそのとき。
その変化した結果をまた新しいExcelとかで
IDataSetに入れるという行為をします。
何だ楽勝じゃんとか思うじゃん、
でもSQLのせいかな?わかんないけど、
データの並び方違ってっからエラー出るんすわ。
ちょっとめんどくさい--
だから私はわざわざ2重ループ回して比較したっていう。。
そのコードをここに保存したい!
だがしかし!
そのコード、会社のPC見ないとわからないから
今日のところはこれで終了 笑
あ。最後に、ちなみに、上のコードはコンパイルしてないので
間違っている可能性もあるかもです。
すみませんーー