[[S2i18n]]

* 元文 [#ee2445c8]

** S2StrutsUnitの概要 [#m7bd69c2]
S2StrutsUnitは、以下の特徴を持っています。

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

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

** S2StrutsUnitリファレンス [#t771b877]
*** S2StrutsUnitを使ったテストクラスの作成方法 [#mfaea93e]
テストクラスは、org.seasar.struts.unit.S2StrutsTestCaseを継承して作成します。 またS2StrutsTestCaseはS2TestCaseを拡張したクラスなので、 テストメソッド等の使用方法はS2TestCaseやJUnitと同様です。

*** S2StrutsUnitの機能 [#h393dbf3]
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 [#x92b8357]
*** 基本的なActionクラスのテスト [#rb798729]
- 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クラスのテスト [#e9f084b2]
- 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クラスのテスト [#zb968440]
- 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);
     }
 }

*** コンテキストを読み込んでのテスト [#ye5d8912]
- 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());
     }
 }


* 英文 [#c61637be]

** Overview of S2StrutsUnit [#b952d75f]
S2StrutsUnit has the following features.

:Unit testing using ServletAPI|

:Testing subclass of Struts Action|

** S2StrutsUnit reference [#o999dff0]
*** How to write test class using S2StrutsUnit [#u5135591]


#comment


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS