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

gooブログ「ウィリアムのいたずらの、まちあるき、たべあるき」がお引越ししてきました

Strutsの単体テスト StrutsTestCase for JUnitの使い方(16日追加)


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ファイルの中身は空(何も書いてない。ファイルだけある状態)