概要
SAStrutsでUnitTestをする際のメモです。
公式サイトや各種WEBを見ながらやっていたのですが
だいぶハマったので。。
手順
インストール
今回UnitTestをするにあたり、S2Unit4というやつを使います。
これを使う為のEclipseプラグインがあるのでインストールします。
EclipseからHelp -> Install New Software…
Work with:に「http://eclipse.seasar.org/updates/3.3/」を設定します
出てきたS2JUnit4 Pluginをインストール
テストクラスの作成
枠だけでもできてるサービスクラス(例としてTrialService.java)があるとします。
Eclipse上でそのサービスクラスを右クリック -> S2JUnit4 -> テスティングペアを開く
テスティングペアがありません、作りますよーyes
細かい設定はそのまま、Nextをクリック
サービスクラスが持っているメソッドが表示されるので
テスト対象とするメソッドをクリックしてFinish
src/test/javaの下あたりにTrialServiceTest.javaが作成されます。
テストクラス用のdiconを作る
テストクラス用のdiconで色々設定できる。
使わないにしても作ります。
作らないとテスト実行時にrunbare で nullPointerExceptionとか出て困る。
作成したTrialServiceTest.javaを右クリック -> S2JUnit4 -> テストケースDiconペアを開く
テストケースDiconペアがありません作りますかーyes
設定はそのまま、Finish
src/test/resourcesにTrialServiceTest.diconが作成されます。
中身は作成されたままでよいです。そのうちモック使いたくなったら記述を追加します。
これはなんの指定をしなくてもテスト実行時に読み込んでくれる。
テストデータを作る
なんとExcelでテストデータを作れます。これはこれで面倒だったり。
デフォルトのファイル名と配置場所は
- TrialServiceTest.javaと同じ場所
- TrialServiceTest.xls という名前だとTrialServiceTestクラスのテストメソッドすべてに適用
- TrialServiceTest_テストメソッド名.xlsという名前だと該当のテストメソッドのみに適用
となります。これはデフォルトのまま設置していくことを推奨。
とりあえずTrialServiceTest.javaと同じ場所にTrialServiceTest.xlsというExcelファイルを作ります。
Excelファイルの中は
- シート名にテーブル名
- 1行目がカラム名
- 2行目以降に値
という構成にします。複数テーブル可能。
ここで作成したものがテストメソッド実行前にテーブルに自動的にロードされます。
そしてテストメソッド完了時に自動的にロールバックされます。
期待値を作る
こうなってほしい結果(期待値)をテストデータと同じようにExcelで作成しておくと
SELECTやUPDATEをした結果できたコンテナとExcelとを比較することができます。
これは便利。
期待値Excelは
- TrialServiceTest.javaと同じ位置
- クラス名_メソッド名_Expected.xlsというファイル名にする
で配置します。
テストデータExcelと同様
- 1行目はカラム名
- 2行目以降に値
をセットします。シート名はなんでもよいみたい。
テストメソッドを作る
これはサンプルをみてもらったほうがよいですね。
import static org.seasar.framework.unit.S2Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.seasar.extension.dataset.DataSet; import org.seasar.framework.beans.util.BeanMap; import org.seasar.framework.unit.PreparationType; import org.seasar.framework.unit.Seasar2; import org.seasar.framework.unit.TestContext; @RunWith(Seasar2.class) public class TrialServiceTest { private TrialServiceTest trialService; private TestContext ctx; public void beforetestFindProfile() { ctx.setPreparationType(PreparationType.ALL_REPLACE); } @Test public void testFindProfile() { // 期待値 DataSet expected = ctx.getExpected(); BeanMap map = TrialService.findProfile("ore"); assertEquals("ore", map.get("uid").toString()); assertEquals(expected, map); } }
最後のexpected とmapを比較しているところが
期待とテスト結果の比較です。
ここで期待値と違うmapが来た場合、failになります。
期待値の保持カラム>結果の保持カラムの場合、
結果の保持カラムの分だけ期待値の保持カラムと比較するようです。
結果の保持カラムが足りない、というfailにはならないので注意
テスト実行
EclipseからRun As Junit とかDebug As Junitしましょう。
おまけ
EclipseからExcelを開いて更新してもなんか反映されない
→ExcelファイルをEXCELから開くよう関連付けしましょう
Eclipse -> Preference -> General -> Editors -> FileAssociates
add で.xls、開くアプリケーションは「参照」でExcel.exe
これでOKです