StrutsTestCase
StrutsTestCaseとは
JUnitと組み合わせて動作するように設計されています。
入手〜設定
入手したzipファイルを解凍後、jarファイルにクラスパスを通す。
この設定とは別に、JUnitの設定を行う必要がある。こちらを参照。また、Cactusを利用したテストを行う場合はJakarta Cactusも別途入手する必要がある。
2種類のテスト方法
Mockオブジェクトを利用したテストを行うと、JUnitとStrutsTestCaseによるテストを実行することができる。この場合、すべてのテストはJVM上で行われる。
コンテナベースアプローチを行う場合、webテストフレームワークのCactusを利用するテストを利用してテストが実行される。テストは実際のサーバー上で行われる。
StrutsTestCaseでは、あらかじめ用意されているクラスを継承してテストケースを作成する。その際に継承するクラスによって、テストの種類が決定される。
テストケースの作成
クラスの作成
import servletunit.struts.MockStrutsTestCase;
public class SampleTest extends MockStrutsTestCase {
public void setUp() throws Exception {
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
}
}
フレームワークで用意されているクラスを利用するために、インポート文を記述する。Mockオブジェクトによるテストを利用するにはservletunit.struts.MockStrutsTestCaseを、Cactusによるテストの場合はservletunit.struts.CactusStrutsTestCaseを継承したクラスを定義する。上記のサンプルではMockオブジェクトを利用している。
初期化処理や後処理を記述したい場合、スーパークラスで定義されているメソッドをオーバーライドする。setUpメソッドにはテストのための初期化処理を、tearDownメソッドにはテスト後の後始末処理を記述する。JUnitと同じメソッドとなっている。
初期化処理
スーパークラスには、web.xmlやStrutsのコンフィギュレーションファイルのパスを指定するメソッドが用意されている。初期化メソッド(setUp)内でメソッド呼び出しを行う。
import servletunit.struts.MockStrutsTestCase;
public class SampleTest extends MockStrutsTestCase {
public void setUp() throws Exception {
super.setUp();
// コンテキストパスの指定
setContextDirectory(new java.io.File("."));
// Servletコンフィグファイル(web.xml)の指定
setServletConfigFile("/WEB-INF/web.xml");
// Strutsコンフィグファイルの指定
setConfigFile("/WEB-INF/struts-config.xml");
}
protected void tearDown() throws Exception {
super.tearDown();
}
}
テストの記述
実際のテストコードは、作成したテストクラス内にtestというプレフィックスが付いた名称のメソッドに記述する。
例:testConnection(), testClose()
画面遷移のテスト
import servletunit.struts.MockStrutsTestCase;
public class SampleTest extends MockStrutsTestCase {
public void setUp() throws Exception {
super.setUp();
// コンテキストパスの指定
setContextDirectory(new java.io.File("."));
// Servletコンフィグファイル(web.xml)の指定
setServletConfigFile("/WEB-INF/web.xml");
// Strutsコンフィグファイルの指定
setConfigFile("/WEB-INF/struts-config.xml");
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testExecute() throws Exception {
// アクション名の指定
setRequestPathInfo("/ListAction");
// 変数に値を設定
addRequestParameter("name", "tarou");
// テスト
actionPerform();
// Actionからの応答がsuccessの時の動作が正常に行われているか確認
verifyForward("success");
// ActionErrorが発生していないことを確認
verifyNoActionErrors();
}
}
addRequestParameter();メソッドでActionFormに任意の値を設定できるので、様々なケースでテストを実行することができる。
エラー発生のテスト
//略(上記の例と同一) public void testExecute() throws Exception { // アクション名の指定 setRequestPathInfo("/ListAction"); // 変数に値を設定 addRequestParameter("name", ""); // テスト actionPerform(); // errors.requiredのActionErrorが発生していることをテストする verifyActionErrors(new String[] {"errors.required"}); }
同時に複数の例外を発生させるテストを行う場合、verifyActionErrors()メソッドの引数に渡す配列に複数のエラーを設定する。
まとめ
規模の大きなシステムをStrutsで構築すると、アクションの数が膨大なものになる。
自動再帰テストによって、利用されていないアクションや定義に誤りのあるアクションの発見が容易になる。また、リファクタリングを行う際に大きな手助けとなる。

