S2StrutsUnitは、以下の特徴を持っています。
- ServletAPIを利用したUnitTest機能
S2Unitと同様にServletAPIのモックオブジェクトを利用してのテストが可能です。
S2Unitとの違いは、ServletAPIからの戻り値をあらかじめ、コンポーネント定義ファイルに記述しておく事が可能な点です。
- StrutsのActionのサブクラスをテストする機能
Actionクラスをテストする事が、簡単に出来るようになります。
Requestなどの値を参照する場合、ActionFormを参照する場合、MappingDispatchActionをテストする場合、
リクエストのパスでテストする場合、それぞれで、必要なパラメータをメソッドの引数に渡すのみで、テスト可能となっています。
テストクラスは、org.seasar.struts.unit.S2StrutsTestCaseを継承して作成します。
またS2StrutsTestCaseはS2TestCaseを拡張したクラスなので、
テストメソッド等の使用方法はS2TestCaseやJUnitと同様です。
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)と同様に、フルパスとテストクラスからの相対パスの両方が指定可能です。
- 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を実行します。
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);
}
}
- 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());
}
}
|