Spring和Hibernate利用JUnit进行测试,大家已经很熟悉.
Struts则利用StrutsTest测试.
下面我们测试一个登录的Struts程序
LoginForm.java 文件
package com.bcxy.struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class LoginForm extends ActionForm {
private String user;
private String pass;
/**
* Returns the user.
* @return String
*/
public String getUser() {
return user;
}
/**
* Set the user.
* @param user The user to set
*/
public void setUser(String user) {
this.user = user;
}
/**
* Returns the pass.
* @return String
*/
public String getPass() {
return pass;
}
/**
* Set the pass.
* @param pass The pass to set
*/
public void setPass(String pass) {
this.pass = pass;
}
}
LoginAction.java 文件
package com.bcxy.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.bcxy.struts.form.LoginForm;
public class LoginAction extends Action {
/**
* Method execute
* @param ActionMapping mapping
* @param ActionForm form
* @param HttpServletRequest request
* @param HttpServletResponse response
* @return ActionForward
* @throws Exception
*/
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
LoginForm loginForm = (LoginForm) form;
String user = loginForm.getUser();
String pass = loginForm.getPass();
if(user.equals(pass)){
return mapping.findForward("success");
}else{
return mapping.findForward("fail");
}
}
}
struts-config.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<!-- ========== Data Source Configuration =============================== -->
<data-sources />
<!-- ========== Form Bean Definitions ================================== -->
<form-beans>
<form-bean name="loginForm" type="com.bcxy.struts.form.LoginForm">
<form-property name="user" type="java.lang.String" />
<form-property name="pass" type="java.lang.String" />
</form-bean>
</form-beans>
<!-- ========== Global Exception Definitions ============================== -->
<global-exceptions />
<!-- ========== Global Forward Definitions =============================== -->
<global-forwards />
<!-- ========== Action Mapping Definitions =============================== -->
<action-mappings>
<action
type="com.bcxy.struts.action.LoginAction"
name="loginForm"
path="/login"
scope="request"
validate="false">
<forward name="success" path="/success.jsp"/>
<forward name="fail" path="/fail.jsp"/>
</action>
</action-mappings>
<!-- ========== Controller Configuration ================================ -->
<controller />
<!-- ========== Message Resources Definitions ============================ -->
<!-- ========== Plug Ins Configuration ================================= -->
<message-resources parameter="com.bcxy.struts.ApplicationResources" />
</struts-config>
下面我们写一个测试文件,它继承strtustest的MockStrutsTestCase类.
/*
* Created on 2004-10-31
*
*/
package test;
import java.io.File;
import servletunit.struts.MockStrutsTestCase;
/**
* @author ezerg
*/
public class LoginTest extends MockStrutsTestCase {
public LoginTest() {
super();
}
/**
* @param arg0
*/
public LoginTest(String arg0) {
super(arg0);
}
public void setUp() throws Exception{
super.setUp();
//指明web应用的根
File context = new File("defaultroot");
setContextDirectory(context);
}
public void tearDown() throws Exception{
super.tearDown();
}
public void testLogin(){
//设置action的path
setRequestPathInfo("/login.do");
//准备所需要的参数
addRequestParameter("user", "test");
addRequestParameter("pass", "test");
//执行
actionPerform();
//验证返回的forward
verifyForward("success");
}
}
在Eclipse中执行run as JUnit Test可看到结果....
主要函数和作用:
- setContextDirectory,设置web应用的根
- setRequestPathInfo,设置request的请求
- addRequestParameter,将参数和对应的值加入request中
- actionPerform,执行这个请求
- verifyForward,验证forward的名字是否正确
- verifyForwardPath,验证forward的path是否正确
- verifyNoActionErrors,验证在action执行过程中没有ActionError产生
- verifyActionErrors,验证在action执行过程中产生的ActionError集合的内容
测试Tile。其基本过程与上面类似,不同之处在于验证:使用verifyTilesForward和verifyInputTilesForward。
测试子模块。其基本过程也和上面一样,不同之处在于需要指定该模块所需要使用的struts-config.xml和调用方式:
- 首先,指定所需要的struts-config.xml:
setConfigFile("mymodule","/WEB-INF/struts-config-mymodule.xml");
- 其次,指明调用的路径:
setRequestPathInfo("/mymodule","/login.do");
使用StrutsTest需要注意的地方:
- 在TestCase中可以访问request、session等对象,StrutsTest为我们提供了访问接口。
- junit的assert函数和fail函数都可以在StrutsTest中使用。
- 对于文件上载,目前StrutsTest并没有什么特别好的方案。具体参见StrusTest的Faq。
下载地址:http://sourceforge.net/projects/strutstestcase/