Strutsで単体テストをする場合、JUnitでは、Actionはチェックできない
(引数に渡すrequest等が、Newできないので、作成できない)
そこで、StrutsTestCase for JUnitを使う。
これを使えば、Tomcatを使わなくても、単体でチェックできる。
で、やりかたについたは、
StrutsTestCase for JUnit v1.7
http://homepage2.nifty.com/ymagic/struts/OtherTranslate/StrutsTestCase/index.html
にあるように、
1.MockStrutsTestCaseを継承したクラスを作り
2.そこのメソッドの中から、テストケースを書いてassertで確認して
3.実行する
ということになる。
で、これを行うためには、jarが必要で、まず、StrutsTestCaseのjarは、
http://sourceforge.net/projects/strutstestcase/files/
にある。
ただ、これだけでは、動かず、Apacheのcommonsのライブラリが必要になる。
以下のものが、最低必要だった。
commons-beanutils-1.8.2.jar
commons-collections-3.2.1.jar
commons-logging-1.1.1.jar
commons-chain-1.2.jar
commons-digester-2.0.jar
これらは、
http://commons.apache.org/downloads/
にある。
(以下、16日追加)
また、当然、Tomcatと、StrutsのJarは必要。
servlet-api.jar
struts-tiles-1.3.9.jar
struts-taglib-1.3.9.jar
struts-core-1.3.9.jar
は、当然必要として、遷移先がJSPになる場合、
jsp-api.jar
も必要になる。
さらに、JUnitのJarも必要になる。
これは、テストケースを作成するとき、JUnitのテストケースとして作成し、その後、継承元をMockStrutsTestCaseに変えればOK(必要なJarは入る)。
また、必要なものとしては、Jar以外に、
実行環境で見えるところ(eclipseを使っている場合、プロジェクト直下)に、
WEB-INFフォルダがあり、その下に
struts-config.xml
web.xml
をおく必要がある。struts-config.xmlとweb.xmlは、実際と同じ内容にする。
なお、上記StrutsTestCase for JUnit v1.7の参考例は、importするファイルとか、書いていない。また、最近のバージョンでは、これは通らない。そこで、ソースすべて(Action,ActionForm、Test)を書いておく。
LoginAction.java
package test; import javax.servlet.http.*; import org.apache.struts.action.*; public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String username = ((LoginForm) form).getUsername(); String password = ((LoginForm) form).getPassword(); ActionErrors errors = new ActionErrors(); if ((!username.equals("deryl")) || (!password.equals("radar"))) errors.add("password",new ActionMessage("error.password.mismatch")); if (!errors.isEmpty()) { saveErrors(request,errors); System.out.println(errors.toString()); return mapping.findForward("login"); } // store authentication info on the session HttpSession session = request.getSession(); session.setAttribute("authentication", "deryl"); // Forward control to the specified success URI return mapping.findForward("success"); } } |
LoginForm.java
package test; import org.apache.struts.action.ActionForm; public class LoginForm extends ActionForm{ private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } |
TestLoginAction.java
package test; import servletunit.struts.MockStrutsTestCase; public class TestLoginAction extends MockStrutsTestCase { public TestLoginAction(String testName) { super(testName); } public void testSuccessfulLogin() { setRequestPathInfo("/login"); addRequestParameter("username","deryl"); addRequestParameter("password","radar"); actionPerform(); verifyForward("success"); assertEquals("deryl",(String) getSession().getAttribute("authentication")); } } |
struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <form-beans> <form-bean name="LoginForm" type="test.LoginForm"/> </form-beans> <action-mappings> <action path="/login" type="test.LoginAction" name="LoginForm" scope="request" validate="false"> <forward name="success" path="/success.jsp"/> <forward name="login" path="/login.jsp"/> </action> </action-mappings> </struts-config> |
(< > は、本当は半角)
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Struts Blank Application</display-name> <!-- Standard Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- The Usual Welcome File List --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> |
(< > は、本当は半角)
eclipseの場合、プロジェクトはこんなかんじ

(リンクするものを、全部Tomcatのlibにつっこんでる。よくない例)
JSPファイルの中身は空(何も書いてない。ファイルだけある状態)