CactusとはJ2EEのモジュールのUnitテストを行うためのフレームワークです。 JUnitのクラスを拡張して、コンテナ上でテストを行うためのクラス群を提供します。
具体的には、requestパラメータにいろいろな値をセットしてブラウザのリクエストをシミュレーションすることや、ブラウザへ返却される画面に正しく値がセットされてるかをチェックするクラスなどを提供してくれます。
またCactusで対象としているモジュールははServlet,JSP,Filter などです。
ここよりダウンロード可能です。 ダウンロードして、サンプルコーディングを作りながら試してみました。
今回はサーブレットとフィルタとJSPを使ったモジュールのテストをしようと思います。
テストのサーブレット(kino.servlet.SampleServlet?)はユーザ入力値を連結して表示するだけの単純なモノです。連結処理を行いJSP(/WEB-INF/index.jsp)に処理を転送します。 フィルタ(kino.filter.RequestEncodingFilter?)はrequest.setCharacterEncoding?()を実行するフィルタです。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String param1 = request.getParameter("param1");
String param2 = request.getParameter("param2");
// パラメタに値が入ってたら値を連結
if (param1 != null && param2 != null) {
String answer = param1 + param2;
request.setAttribute("answer", answer);
request.setAttribute("param1", param1);
request.setAttribute("param2", param2);
}
sc.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
}<jsp:useBean id="answer" class="java.lang.String" scope="request" />
<jsp:useBean id="param1" class="java.lang.String" scope="request" />
<jsp:useBean id="param2" class="java.lang.String" scope="request" />
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
<title>サンプルアプリケーション</title>
</head>
<body>
<p>サンプルアプリケーション</p>
<form action="<%=request.getContextPath()%>/SampleServlet" method="get">
<table border="0">
<tbody>
<tr>
<td>param1</td>
<td><input type="text" name="param1" size="20" value='<%=param1%>' /></td>
</tr>
<tr>
<td>param2</td>
<td><input type="text" name="param2" size="20" value='<%=param2%>' /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="action" value="実行" /></td>
</tr>
</tbody>
</table>
<p><%=answer%></p>
</form>public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain)
throws ServletException, IOException {
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}WEB-INF/lib ディレクトリに
junit-3.8.1.jar aspectjrt-1.1.1.jar cactus-1.6.1.jar commons-httpclient-2.0.jar commons-logging-1.0.3.jar
を配置しておきます。
次にクラスパスが通っているディレクトリにcactus.propertiesをおいておきます。 このファイルに記述する内容は
cactus.contextURL=http://localhost:9080/CactusTest
のみでOKです(テスト対象のURL)。
jspRedirector.jspをルート直下に配置します。
最終的にディレクトリ構成は以下のようになりました。
Cactusはテスト対象のプログラムを直接呼び出すのではなく、プロクシ(リダイレクタとかいう)を介して
クライアント(テストクラス) -> リダイレクタ -> テストクラス -> テスト対象クラス
という方式でテストを行います。というわけでweb.xmlにリダイレクタとなるサーブレットやフィルタ、JSPなどを登録する必要があります。 登録する内容は
<filter> <filter-name>FilterTestRedirector</filter-name> <filter-class>org.apache.cactus.server.FilterTestRedirector</filter-class> </filter> <filter-mapping> <filter-name>FilterTestRedirector</filter-name> <url-pattern>/FilterRedirector</url-pattern> </filter-mapping> <servlet> <servlet-name>ServletTestRedirector</servlet-name> <servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class> </servlet> <servlet> <servlet-name>jspRedirector</servlet-name> <jsp-file>/jspRedirector.jsp</jsp-file> </servlet> <servlet-mapping> <servlet-name>ServletTestRedirector</servlet-name> <url-pattern>/ServletRedirector</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>jspRedirector</servlet-name> <url-pattern>/JspRedirector</url-pattern> </servlet-mapping>
などです。
以上で準備は完了です。
ようやくテストクラスを記述します。
webRequest.setURL("localhost:8080","/[context]","/[ServletName]",null,null);
この記事は
現在のアクセス:27094