| S2StrutsUnitの概要 S2StrutsUnitリファレンス S2StrutsUnitを使ったテストクラスの作成方法 S2StrutsUnitの機能 S2StrutsTestCase Example 基本的なActionクラスのテスト ActionFormを使用したActionクラスのテスト MappingDispatchActionクラスのテスト コンテキストを読み込んでのテスト ## S2StrutsUnitの概要 S2StrutsUnitは、以下の特徴を持っています。 ServletAPIを利用したUnitTest機能 S2Unitと同様にServlerAPIのモックオブジェクトを利用してのテストが可能です。 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のfoword名となります。 ・ActionとActionFormを指定してのActionの実行 Actionクラスの実行を行う場合、ActionとActionFormのインスタンスをS2StrutsTestCase#execute(Action,ActionForm)の引数に渡すのみで、 サービスなどがインジェクションされたActionクラスを実行可能です。 また、Actionクラスのインスタンスを生成せずに同様の動作をするS2StrutsTestCase#execute(Class,ActionForm)というメソッドもあります。 実行した結果の戻り値は、Actionを実行した場合に返されるActionMappingのfoword名となります。 ・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のfoword名となります。 ・パスを指定しての実行 パスを指定して、Actionの実行を行う場合、パスをS2StrutsTestCase#execute(String)の引数に渡すのみで、パスに対応したActionが生成され、 サービスなどがインジェクションされたActionクラスを実行可能です。 実行した結果の戻り値は、Actionを実行した場合に返されるActionMappingのfoword名となります。 パスを指定して実行を行う場合、下記の、コンテキストの読み込みを行う必要があります。 ・コンテキストの読み込み パスを指定して、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());
        }
    }
| © Copyright The Seasar Project and the others 2004, all rights reserved.