Seasar DI Container with AOP

S2StrutsUnit概要

S2StrutsUnitは、以下の特徴を持っています。

  • ServletAPIを利用したUnitTest機能
  • S2Unitと同様にServletAPIのモックオブジェクトを利用してのテストが可能です。 S2Unitとの違いは、ServletAPIからの戻り値をあらかじめ、コンポーネント定義ファイルに記述しておく事が可能な点です。

  • StrutsのActionのサブクラスをテストする機能
  • Actionクラスをテストする事が、簡単に出来るようになります。 Requestなどの値を参照する場合、ActionFormを参照する場合、MappingDispatchActionをテストする場合、 リクエストのパスでテストする場合、それぞれで、必要なパラメータをメソッドの引数に渡すのみで、テスト可能となっています。

S2StrutsUnitリファレンス

S2StrutsUnitを使ったテストクラスの作成方法

テストクラスは、org.seasar.struts.unit.S2StrutsTestCaseを継承して作成します。 またS2StrutsTestCaseはS2TestCaseを拡張したクラスなので、 テストメソッド等の使用方法はS2TestCaseやJUnitと同様です。

S2StrutsUnitの機能

S2Strutsを使った開発のテストを簡単に行えるように以下の機能があります。

・Actionを指定してのActionの実行
Actionクラスの実行を行う場合、ActionのインスタンスをS2StrutsTestCase#execute(Action)の引数に渡すのみで、 サービスなどがインジェクションされたActionクラスを実行可能です。
また、Actionクラスのインスタンスを生成せずに同様の動作をするS2StrutsTestCase#execute(Class)というメソッドもあります。
実行した結果の戻り値は、Actionを実行した場合に返されるActionMappingのforword名となります。
・ActionとActionFormを指定してのActionの実行
Actionクラスの実行を行う場合、ActionとActionFormのインスタンスをS2StrutsTestCase#execute(Action,ActionForm)の引数に渡すのみで、 サービスなどがインジェクションされたActionクラスを実行可能です。
また、Actionクラスのインスタンスを生成せずに同様の動作をするS2StrutsTestCase#execute(Class,ActionForm)というメソッドもあります。
実行した結果の戻り値は、Actionを実行した場合に返されるActionMappingのforword名となります。
・MappingDispatchActionの実行
MappingDispatchActionクラスの実行を行う場合、ActionとActionFormのインスタンスとメソッド名をS2StrutsTestCase#execute(Action,ActionForm,String)の引数に渡すのみで、 サービスなどがインジェクションされたActionクラスを実行可能です。また、ActionFormを使用しない場合に対応した、S2StrutsTestCase#execute(Action,String)というメソッドが用意されています。
また、Actionクラスのインスタンスを生成せずに同様の動作をするS2StrutsTestCase#execute(Class,ActionForm,String)というメソッドもあります。また、S2StrutsTestCase#execute(Class,String)というメソッドが用意されています。
実行した結果の戻り値は、Actionを実行した場合に返されるActionMappingのforword名となります。
・パスを指定しての実行
パスを指定して、Actionの実行を行う場合、パスをS2StrutsTestCase#execute(String)の引数に渡すのみで、パスに対応したActionが生成され、 サービスなどがインジェクションされたActionクラスを実行可能です。
実行した結果の戻り値は、Actionを実行した場合に返されるActionMappingのforword名となります。
パスを指定して実行を行う場合、下記の、コンテキストの読み込みを行う必要があります。
・コンテキストの読み込み
パスを指定して、web.xmlや、そこに記述されている、struts-config.xmlなどの読み込みが可能です。 読み込みに使用するメソッドは、setDocBase(String)です。引数で指定したパスの直下に、WEB-INFディレクトリが存在する必要があります。
引数のパスは、リソースから検索します。また、S2TestCase#include(String)と同様に、フルパスとテストクラスからの相対パスの両方が指定可能です。

Example

基本的なActionクラスのテスト

  • S2StrutsTestCaseを継承します。
  • setUp()で、HttpServletAPIのモックを定義したコンポーネント定義ファイルとs2struts.diconをインクルードします。
  • setUpExecuteTrue()で、Actionと、Serviceのコンポーネントを定義したファイルをインクルードしています。
  • testExecuteTrue()のexecute(TestAction.class)で、TestActionを実行しています。
  • Forward先(executeメソッドの戻り値)や、ActionMessages(getActionMessages()で取得)、ActionErrors(getActionErrors()で取得)などを確認します。
public class TestActionTest extends S2StrutsTestCase {

    public TestActionTest(String name) {
        super(name);
    }

    protected void setUp() {
        include("HttpMockObject.dicon");
        include("s2struts.dicon");
    }

    public void setUpExecuteTrue() {
        include("TestServiceReturnTrue.dicon");
    }

    public void testExecuteTrue() throws Exception {
        String actual = execute(TestAction.class);

        assertEquals("success", actual);

        String[] values = {"val1", "val2", "val3", "val4", "val5"};
        ActionMessages expectedMessages = new ActionMessages();
        expectedMessages.add("message", new ActionMessage("messageKey", values));
        assertEquals(expectedMessages, getActionMessages());
    }
}
	

ActionFormを使用したActionクラスのテスト

  • ActionFormのインスタンスを生成し、そのインスタンスにテストに使用する値を設定し、Actionを実行します。
public class FormTestActionTest extends S2StrutsTestCase {

    ...

    public void testGetValueFromForm() throws Exception {
        TestActionForm form = new TestActionForm();
        form.setVal("foo");

        String actual = execute(FormTestAction.class, form);

        assertEquals("foo", actual);
    }
}
	

MappingDispatchActionクラスのテスト

  • foo(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse)というメソッドをテストする場合は、executeメソッドの引数に"foo"を渡します。
public class MappingDispatchActionTest extends S2StrutsTestCase {

    ...

    public void testFooMethod() throws Exception {
        String actual = execute(DispatchTestAction.class, "foo");
        assertEquals("success", actual);
    }
}
	

コンテキストを読み込んでのテスト

  • setUp()で、コンテキストの存在するディレクトリをsetDocBase(String)で指定します。
  • 実際に実行されたActionのインスタンスは、getExecutedAction()で取得する事が出来ます。
  • 実際に実行されたActionFormのインスタンスは、getExecutedActionForm()で取得する事が出来ます。
public class LoadWebContextTest extends S2StrutsTestCase {

    ....

    protected void setUp() {
        ...
        setDocBase("org/seasar/struts/unit");
    }

    public void testExecuteString() throws Exception {
        String actual = execute("/login?id=id&pass=pass");

        assertEquals("success", actual);
        assertEquals(LoginAction.class, getExecutedAction().getClass());
        assertNull(getExecutedActionForm());
    }
}