ユニットテストのサポート

S2Clickでは、フレームワークとしての機能ではありませんが、 S2Clickを使用して開発されたアプリケーションに対するJUnitテストケースの記述を効率化するための抽象基底クラスを提供しています。

なお、これらのユニットテストサポートは実験的な試みのため、今後APIの大きな変更が行われる可能性があります。

ページクラスのユニットテスト

ページクラスのテストケースはorg.seasar.s2click.test.S2ClickPageTestCaseを継承して作成します。 型パラメータでテスト対象のページクラスを指定します。 テスト対象のページクラスのインスタンスはpageフィールドで参照できます。 また、ページクラスに対する共通の初期化処理などを行う場合はinitPage()メソッドをオーバーライドします。

ページクラスのテストケースの実装例を以下に示します。

package org.seasar.s2click.example.page;

import org.apache.click.ActionListener;
import org.seasar.s2click.test.S2ClickPageTestCase;

public class AddPageTest extends S2ClickPageTestCase<AddPage> {

    @Override
    protected void initPage(AddPage page){
        super.initPage(page);

        page.form.num1.setValueObject(1);
        page.form.num2.setValueObject(2);
    }

    public void testAddPage(){
        ActionListener listener = page.form.submit.getActionListener();
        listener.onAction(page.form.submit);

        assertEquals(3, page.form.result.getInteger().intValue());
    }

} 

サービスクラスのユニットテスト

サービスクラスのテストケースはorg.seasar.s2click.test.S2ClickServiceTestCaseを継承して作成します。 型パラメータでテスト対象のサービスクラスを指定します。 テスト対象のサービスクラスのインスタンスはserviceフィールドで参照できます。

S2TestCaseの機能に加え、さらにユニットテストを省力化するために以下のような機能を提供します。

初期データの自動投入
テストクラス名_テストメソッド名_data.xls という名前のExcelファイルが テストクラスと同じパッケージに存在する場合、そのデータを自動的にデータベースに投入します。
Excelファイルの自動生成
テストメソッドにGenerateExcelアノテーションを付与しておくことで、 期待値として比較するためのExcelファイルを生成することができます。 生成されるExcelファイルはテストクラス名_テストメソッド名_expect.xlsというファイル名になります。 生成されるのは初期データの自動投入直後になります。 すでにExcelファイルが存在する場合はなにも行いません。
GenerateExcelアノテーションは主にデータベースの検索処理の結果を検証する際に使用するExcelファイルの生成に利用できます。 アノテーションの記述によってExcel生成時の検索条件やソート順、対象カラムを指定できるので、検証したいデータに応じたExcelを生成することができます。
DBの内容とExcelをアノテーションで比較
テストメソッドにAssertアノテーションを付与しておくことで、 指定したテーブルのデータをテストクラス名_テストメソッド名_expect.xls という名前のExcelファイルと比較することができます。 さらに、まだExcelファイルが存在しない場合はデータベースから生成されます。 このときの生成のタイミングはGenerateExcelアノテーションで生成する場合と異なり、 テストメソッドの実行直後になります。
Assertアノテーションは主にデータベースの更新処理を行った結果が正しいかどうかの検証に使用します。

なお、Excelファイルの自動生成機能を使用するにはS2ClickTestConfigをdiconファイルに登録し、 sourceDirプロパティにテストケースのソースフォルダを指定しておく必要があります。 テスト時のみ読み込むdiconファイルを用意し、以下のように記述を追加してください。

<component class="org.seasar.s2click.test.S2ClickTestConfig" instance="singleton">
  <property name="sourceDir">"test"</property>
</component> 

サービスクラスのテストケースの実装例を以下に示します。

package org.seasar.s2click.example.service;

import java.text.SimpleDateFormat;
import java.util.List;

import org.seasar.s2click.test.Assert;
import org.seasar.s2click.test.Assert.Table;
import org.seasar.s2click.test.S2ClickServiceTestCase;
import org.seasar.s2click.example.entity.Message;

public class MessageServiceTest extends S2ClickServiceTestCase<MessageService> {

    @Assert(tables = @Table(name="MESSAGE", excludeColumns={"MESSAGE_ID", "DATE"}))
    public void testInsertTx() throws Exception {
        Message message = new Message();
        message.name = "たけぞう";
        message.message = "テスト";
        message.date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse("2009/01/01 12:34:56");

        service.insert(message);
    }

}