#author("2019-09-27T02:07:47+00:00","","") #topicpath ---- //ここにコンテンツを記述します。 **Cactusとは [#qd04ede8] [[Cactus:http://jakarta.apache.org/cactus/index.html]]とはJ2EEのモジュールのUnitテストを行うためのフレームワークです。 JUnitのクラスを拡張して、コンテナ上でテストを行うためのクラス群を提供します。 具体的には、requestパラメータにいろいろな値をセットしてブラウザのリクエストをシミュレーションすることや、ブラウザへ返却される画面に正しく値がセットされてるかをチェックするクラスなどを提供してくれます。 またCactusで対象としているモジュールははServlet,JSP,Filter などです。 #contents **ダウンロード [#l74a60e4] [[ここ:http://jakarta.apache.org/cactus/downloads.html]]よりダウンロード可能です。 ダウンロードして、サンプルコーディングを作りながら試してみました。 **サンプルの説明 [#df14f0da] 今回はサーブレットとフィルタとJSPを使ったモジュールのテストをしようと思います。 #ref(01.png) テストのサーブレット(kino.servlet.SampleServlet)はユーザ入力値を連結して表示するだけの単純なモノです。連結処理を行いJSP(/WEB-INF/index.jsp)に処理を転送します。 フィルタ(kino.filter.RequestEncodingFilter)はrequest.setCharacterEncoding()を実行するフィルタです。 ***サンプルの一部 [#n765869a] -SampleServlet 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); } -index.jsp <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> -RequestEncodingFilter public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { request.setCharacterEncoding(encoding); chain.doFilter(request, response); } **Cactusでテストを行うための準備 [#jd3e8f56] ***jarファイルの配置 [#wc3e19be] 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の配置 [#q992af08] 次にクラスパスが通っているディレクトリにcactus.propertiesをおいておきます。 このファイルに記述する内容は cactus.contextURL=http://localhost:9080/CactusTest のみでOKです(テスト対象のURL)。 ***jspRedirector.jspの配置 [#s1e9c708] jspRedirector.jspをルート直下に配置します。 最終的にディレクトリ構成は以下のようになりました。 #ref(03.png) *** web.xmlの編集 [#u1c3cb52] 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> などです。 以上で準備は完了です。 **ようやくテストクラスの記述 [#n6df8ed7] ようやくテストクラスを記述します。 *** [#u3be3a1b] **TIPS [#c96516bd] *** リクエストURLを偽造する。 [#pacedaa3] webRequest.setURL("localhost:8080","/[context]","/[ServletName]",null,null); -http://www.ingrid.org/jajakarta/cactus/doc/howto_testcase_servlet.html ---- この記事は #vote(おもしろかった[14],そうでもない[9]) #topicpath SIZE(10){現在のアクセス:&counter;}