今回はSAStrutsのサービスクラスに対してのテストを作成しました。
■テストまでの方法
1.テストケースを作成するサービスクラスを右クリックし、[S2Junit4]-[テスティングペアを開く]をクリック。
2.新規の場合だと、「テスティングペアがありません。作成しますか?」とダイアログが出るので、[はい]を選択。
3.新規Junitテストケースのダイアログが出るので、[次へ]を選択
4.テストを行うメソッドを選択する画面が表示されるので、テストを行うメソッドだけチェックを入れて、[完了]を選択。
5.src/test/javaのserviceパッケージにサービス名Test.javaが作成されます。
6.TestContextをインスタンス変数で宣言する。
7.個々のテストに対する初期化メソッド(beforeテスト名)を追加し、DBに今あるデータを一時的にテストデータに置き換えるために設定を追加。
8.テストメソッドで、サービスを呼び出し、その結果とテストコンテキストから取得した期待値を検証する。
6~8に関して、細かい部分は以下のソースを参照。
これで、一つのテストが完了できた。
◆ソース
package jp.co.zz.service;
import static org.seasar.framework.unit.S2Assert.assertEquals;
import java.util.List;
import jp.co.zz.entity.Hoge;
import org.junit.runner.RunWith;
import org.seasar.extension.dataset.DataSet;
import org.seasar.framework.unit.PreparationType;
import org.seasar.framework.unit.Seasar2;
import org.seasar.framework.unit.TestContext;
@RunWith(Seasar2.class)
public class HogeServiceTest {
private HogeService hogeService;
private TestContext ctx;
public void beforeTestFindAll() {
ctx.setPreparationType(PreparationType.ALL_REPLACE);
}
public void testFindAll() {
List<Hoge> hogeList = hogeService.findAll();
DataSet dataSet = ctx.getExpected();
assertEquals(dataSet, hogeList);
}
}
■使ってみて便利なところ
・テストデータをExcelで作って、ファイル名をテストクラス名_テストメソッド名.xlsにすれば勝手に追加して、テストが終わったら削除してくれる。
・期待値もファイル名をテストクラス名_テストメソッド名_Expected.xlsにすれば、TestContextから簡単に使える。
・テストデータと期待値を簡単にチェックできる。
■テストデータについて
テストデータと期待値のファイルは上記のソースを例にすると
テストデータ:HogeServiceTest_testFindAll.xls
期待値データ:HogeServiceTest_testFindAll_Expected.xls
を作成し、テストクラスと同じパッケージ(上記だとjp.co.zz.service)に配置する。
また、テストデータや期待値は1行目にカラム目、2行目以降にデータを書けばよい。
■やっててはまったところ
やっていてはまったところは、データの中にチェックしたくない項目(自動で挿入されるIDやら日付やらのカラム)をチェックから外すにはどうすればいいか悩みました。
S2TestCaseでチェックしているソースを見ればわかったのですが
期待値のファイルにチェックしたくない項目(カラム)自体を書かなければ、
チェックされません。
S2TestCaseの以下の箇所を参照。
for (int j = 0; j < expected.getColumnSize(); ++j) {
try {
String columnName = expected.getColumnName(j);
Object expectedValue = expectedRow.getValue(columnName);
ColumnType ct = ColumnTypes.getColumnType(expectedValue);
Object actualValue = actualRow.getValue(columnName);
if (!ct.equals(expectedValue, actualValue)) {
assertEquals(message + ":Row=" + i + ":columnName="
+ columnName, expectedValue, actualValue);
}
} catch (AssertionFailedError e) {
errorMessages.add(e.getMessage());
}
}