ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

サーブレットをJUnitでテストしたいとき

2014-08-14 18:25:49 | JavaとWeb
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());




【サンプルソース】

チェックされる側のサーブレットサンプル
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);
	}
}






いじょう。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする