HTTPUnitを使って、はまった。
セッションがうまく取れなかったり・・・なにが悪かったんだろう・・
とにかくうまくいかなかったんだけど、
ここ
■[Java][Spring] JUnit(djUnit)でServletをテスト(with MockHttpServletRequest)
http://d.hatena.ne.jp/pikipikipikky/20110614/1308057548
に書いてある
•MockHttpServletRequest
•MockHttpServletResponse
を使えば、一発だった。
そこで、今回は、これについて
【サーブレットテストをJUnitで行うときの問題】
サーブレットを生成(new)することろはいいが、duGet,doPost,serviceを呼び出すとき、
HttpServletRequest、HttpServletResponseで、リクエストとレスポンスをセットしなければならない。このとき、以下の問題が起こる
・この2つは、インターフェースであり、クラスではない。どのクラスからインスタンス化するのか?
・引数の値が設定したくても、パラメータはgetParameterはあっても、setParameterがない
これを解決するのが、上記のクラス。実際にそれを生成すると、setParameterして、サーブレットに値が渡せる。
【ダウンロード&インストール】
以下のファイルをダウンロードします。
1.Spring Mock:MockHttpServletRequestとMockHttpServletResponse
が入っています。
spring-mock-2.0.6.jar
http://www.java2s.com/Code/Jar/s/Downloadspringmock206jar.htm
2.spring-core:上記1が呼び出します。
spring-core-3.2.3.release.jar
http://www.java2s.com/Code/Jar/s/Downloadspringcore323releasejar.htm
3.commons-logging:なんか、必要みたいです。
commons-logging-1.2-bin.zip
http://commons.apache.org/proper/commons-logging/download_logging.cgi
これらを、ビルドパスに設定します。
【テストについて】
テスト側のクラスはJUnitでふつうにやっているときと同じです。
こんなふうになります。
1.サーブレット生成
Tashizan tashizan = new Tashizan();
2.リクエスト、レスポンスを生成
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse resp = new MockHttpServletResponse();
3.リクエストにデータ設定
req.setParameter( "args1", "1" );
req.setParameter( "args2", "2" );
4.もし、セッションに設定する必要があれば・・・
HttpSession session = req.getSession();
session.setAttribute("ans","1");
5.実行!
try {
tashizan.service(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
6.結果をチェック
6-1.パラメータの確認、取得
assertEquals( "args1", "1", req.getParameter("args1") );
assertEquals( "args2", "2", req.getParameter("args2") );
6-2.セッションの中身確認
HttpSession session = req.getSession();
assertEquals("ans","3",session.getAttribute("ans"));
6-3.フォワード先確認(response.getForwardedUrl())
assertEquals("ans","/ans.jsp",resp.getForwardedUrl());
【サンプルソース】
チェックされる側のサーブレットサンプル
チェックする側のJUnitサンプル
いじょう。
セッションがうまく取れなかったり・・・なにが悪かったんだろう・・
とにかくうまくいかなかったんだけど、
ここ
■[Java][Spring] JUnit(djUnit)でServletをテスト(with MockHttpServletRequest)
http://d.hatena.ne.jp/pikipikipikky/20110614/1308057548
に書いてある
•MockHttpServletRequest
•MockHttpServletResponse
を使えば、一発だった。
そこで、今回は、これについて
【サーブレットテストをJUnitで行うときの問題】
サーブレットを生成(new)することろはいいが、duGet,doPost,serviceを呼び出すとき、
HttpServletRequest、HttpServletResponseで、リクエストとレスポンスをセットしなければならない。このとき、以下の問題が起こる
・この2つは、インターフェースであり、クラスではない。どのクラスからインスタンス化するのか?
・引数の値が設定したくても、パラメータはgetParameterはあっても、setParameterがない
これを解決するのが、上記のクラス。実際にそれを生成すると、setParameterして、サーブレットに値が渡せる。
【ダウンロード&インストール】
以下のファイルをダウンロードします。
1.Spring Mock:MockHttpServletRequestとMockHttpServletResponse
が入っています。
spring-mock-2.0.6.jar
http://www.java2s.com/Code/Jar/s/Downloadspringmock206jar.htm
2.spring-core:上記1が呼び出します。
spring-core-3.2.3.release.jar
http://www.java2s.com/Code/Jar/s/Downloadspringcore323releasejar.htm
3.commons-logging:なんか、必要みたいです。
commons-logging-1.2-bin.zip
http://commons.apache.org/proper/commons-logging/download_logging.cgi
これらを、ビルドパスに設定します。
【テストについて】
テスト側のクラスはJUnitでふつうにやっているときと同じです。
こんなふうになります。
1.サーブレット生成
Tashizan tashizan = new Tashizan();
2.リクエスト、レスポンスを生成
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse resp = new MockHttpServletResponse();
3.リクエストにデータ設定
req.setParameter( "args1", "1" );
req.setParameter( "args2", "2" );
4.もし、セッションに設定する必要があれば・・・
HttpSession session = req.getSession();
session.setAttribute("ans","1");
5.実行!
try {
tashizan.service(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
6.結果をチェック
6-1.パラメータの確認、取得
assertEquals( "args1", "1", req.getParameter("args1") );
assertEquals( "args2", "2", req.getParameter("args2") );
6-2.セッションの中身確認
HttpSession session = req.getSession();
assertEquals("ans","3",session.getAttribute("ans"));
6-3.フォワード先確認(response.getForwardedUrl())
assertEquals("ans","/ans.jsp",resp.getForwardedUrl());
【サンプルソース】
チェックされる側のサーブレットサンプル
package sample; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class Tashizan extends HttpServlet { public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { // 引数から値を取得する int arg1 = Integer.parseInt(request.getParameter("args1")); int arg2 = Integer.parseInt(request.getParameter("args2")); // セッションに値を設定する HttpSession session = request.getSession(); session.setAttribute("ans", String.valueOf(arg1+arg2)); // フォワードする RequestDispatcher dispatch = request.getRequestDispatcher("/ans.jsp"); dispatch.forward(request, response); } } |
チェックする側のJUnitサンプル
package sample; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class Tashizan extends HttpServlet { public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { // 引数から値を取得する int arg1 = Integer.parseInt(request.getParameter("args1")); int arg2 = Integer.parseInt(request.getParameter("args2")); // セッションに値を設定する HttpSession session = request.getSession(); session.setAttribute("ans", String.valueOf(arg1+arg2)); // フォワードする RequestDispatcher dispatch = request.getRequestDispatcher("/ans.jsp"); dispatch.forward(request, response); } } |
いじょう。