采用Struts中的Mock方式模拟action和actionForm进行测试
基础类:STCRequestProcessor
作用:Ioc 将模拟的Action,ActionForm注入到struts-config.xml中的相应的action位置
package test.sample.service.util;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.RequestProcessor;
import org.apache.struts.util.RequestUtils;
/** *//**
* @author administrator
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class STCRequestProcessor extends RequestProcessor {
private static HashMap mockActionFormMap = new HashMap();
private static HashMap mockActionMap = new HashMap();
public static void addMockAction(String actionStr, String className)
{
mockActionMap.put(actionStr, className);
}
public static void addMockActionForm(String actionFormStr,String className)
{
mockActionFormMap.put(actionFormStr, className);
}
/** *//**
* We will insert Mock ActionForm for testing through this method
*/
protected ActionForm processActionForm(
HttpServletRequest request,
HttpServletResponse response,
ActionMapping mapping) {
// Create (if necessary a form bean to use
String formBeanName = mapping.getName();
String mockBeanClassName = (String) mockActionFormMap.get(formBeanName);
if (mockBeanClassName == null)
return super.processActionForm(request, response, mapping);
ActionForm instance = null;
try {
Class formClass = Class.forName(mockBeanClassName );
instance = (ActionForm) formClass.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
instance.setServlet(servlet);
if (instance == null) {
return (null);
}
if (log.isDebugEnabled()) {
log.debug(
" Storing ActionForm bean instance in scope '"
+ mapping.getScope()
+ "' under attribute key '"
+ mapping.getAttribute()
+ "'");
}
if ("request".equals(mapping.getScope())) {
request.setAttribute(mapping.getAttribute(), instance);
} else {
HttpSession session = request.getSession();
session.setAttribute(mapping.getAttribute(), instance);
}
return (instance);
}
/** *//**
* We will insert Mock Action Class through this method
*/
protected Action processActionCreate(
HttpServletRequest request,
HttpServletResponse response,
ActionMapping mapping)
throws IOException {
String orignalClassName = mapping.getType();
String mockClassName = (String)mockActionMap.get(orignalClassName);
if( mockClassName == null )
return super.processActionCreate(request,response,mapping);
String className = mockClassName;
if (log.isDebugEnabled()) {
log.debug(" Looking for Action instance for class " + className);
}
Action instance = null;
synchronized (actions) {
// Return any existing Action instance of this class
instance = (Action) actions.get(className);
if (instance != null) {
if (log.isTraceEnabled()) {
log.trace(" Returning existing Action instance");
}
return (instance);
}
// Create and return a new Action instance
if (log.isTraceEnabled()) {
log.trace(" Creating new Action instance");
}
try {
instance = (Action) RequestUtils.applicationInstance(className);
} catch (Exception e) {
log.error(
getInternal().getMessage("actionCreate", mapping.getPath()),
e);
response.sendError(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
getInternal().getMessage(
"actionCreate",
mapping.getPath()));
return (null);
}
instance.setServlet(this.servlet);
actions.put(className, instance);
}
return (instance);
}
}
Test类:
setUp()方法:
super.setUp();//调用mockStrutsTestCase中的setUp方法
File web = new File("E:/project/portal/WebContent");
this.setContextDirectory(web);//定位工程包的位置
setConfigFile("/WEB-INF/web.xml");//定位工程中的web.xml位置
setConfigFile("/WEB-INF/struts-config.xml");//定位工程中struts-config.xml位置
STCRequestProcessor.addMockActionForm("ser_wordForm", "test.sample.service.form.MockWordForm");//注入模拟的form
STCRequestProcessor.addMockAction("com.huawei.service.action.WordAction","test.sample.service.action.MockWordAction");//注入模拟的action
setRequestPathInfo("/service/word");//定义struts-config.xml中的path名称
package test.sample.service.action;
import java.io.File;
import servletunit.struts.MockStrutsTestCase;
import test.sample.service.util.STCRequestProcessor;
/** *//**
*
- setContextDirectory,设置web应用的根
- setRequestPathInfo,设置request的请求
- addRequestParameter,将参数和对应的值加入request中
- actionPerform,执行这个请求
- verifyForward,验证forward的名字是否正确
- verifyForwardPath,验证forward的path是否正确
- verifyNoActionErrors,验证在action执行过程中没有ActionError产生
- verifyActionErrors,验证在action执行过程中产生的ActionError集合的内容
* @author donganlei
*
*/
public class MockWordActionTest extends MockStrutsTestCase {
public void testInvalidPageflag1()throws Exception{
addRequestParameter("reqCode","getWordList");
addRequestParameter("pageflag","userquery");
actionPerform();
verifyNoActionErrors();
verifyForward("querylist");
}
public void testInvalidPageflag2()throws Exception{
addRequestParameter("reqCode","getWordList");
addRequestParameter("pageflag","seatquery");
actionPerform();
verifyNoActionErrors();
verifyForward("querylist");
}
public void testInvalidInitUpdate()throws Exception{
addRequestParameter("reqCode","initUpdate");
actionPerform();
verifyNoActionErrors();
verifyForward("update");
}
public void testinitUpdate()throws Exception{
addRequestParameter("reqCode","initUpdate");
addRequestParameter("wordid","3");
addRequestParameter("roomid","3");
actionPerform();
verifyNoActionErrors();
verifyForward("update");
}
protected void setUp() throws Exception {
super.setUp();
File web = new File("E:/project/portal/WebContent");
this.setContextDirectory(web);
setConfigFile("/WEB-INF/web.xml");
setConfigFile("/WEB-INF/struts-config.xml");
STCRequestProcessor.addMockActionForm("ser_wordForm", "test.sample.service.form.MockWordForm");
STCRequestProcessor.addMockAction("com.huawei.service.action.WordAction","test.sample.service.action.MockWordAction");
setRequestPathInfo("/service/word");
}
public static void main(String args[]){
junit.textui.TestRunner.run(MockWordActionTest.class);
}
}
Struts-congfig.xml中的processorClass
<controller>
<set-property property="processorClass" value="test.sample.service.util.STCRequestProcessor"/>
</controller>
分享到:
相关推荐
这个工程例子是基于StrutsTestCase的,它提供了实际操作和理解StrutsTestCase如何工作的实例。 在Struts应用程序中,Action类是处理用户请求的核心组件,通常负责业务逻辑的调用和视图的转发。然而,由于Struts的...
StrutsTestCase是Apache Struts框架的一个扩展,它提供了一种集成测试工具,使得开发者能够方便地对基于Struts的应用程序进行单元测试和功能测试。这个压缩包“StrutsTestCase-2.1.4(含文档、源码、官方示例).rar...
- **Struts2** 提供了更好的测试支持,Action可以通过设置属性、初始化和调用方法进行单元测试,依赖注入使得测试更加简单。 7. **输入数据处理** - **Struts1.x** 使用ActionForm对象捕获用户输入,ActionForm...
#### 使用StrutsTestCase测试Action - **Mock模式**:解释如何在Mock模式下使用StrutsTestCase进行测试。 - **Cactus模式**:介绍Cactus模式下的StrutsTestCase使用方法。 #### 使用jWebUnit测试JSP - **功能测试**...
Struts1的Action由于暴露了Servlet API,测试需要在容器内进行,通常依赖于StrutsTestCase这样的工具。然而,Struts2的Action可以通过依赖注入轻松地进行单元测试,Action的属性可以被初始化和设置,使得测试更加...
- **单元测试的支持**:在Struts1中,由于Action对象与Servlet API紧密耦合,因此对其进行单元测试时通常需要模拟整个Web环境,例如使用StrutsTestCase库提供的Mock对象。而在Struts2中,Action对象更加独立,可以更...
- **Struts2**:Action类不直接依赖容器,而是通过简单的Maps表示Servlet上下文,更容易进行单元测试。 4. **测试性** - **Struts1**:由于execute方法直接暴露Servlet API,测试较为困难,需要第三方扩展如...
3. **使用StrutsTestCase测试Action** - 解释StrutsTestCase的用途。 - 通过步骤演示如何利用StrutsTestCase进行测试。 4. **使用jWebUnit测试JSP** - 介绍jWebUnit工具的特点。 - 演示如何使用jWebUnit进行...
- ActionForms不易用,不支持单元测试,需要依赖StrutsTestCase进行集成测试。 2. **实现MVC的方式**: - Struts使用JSP作为视图(View),ActionServlet作为控制器(Controller),JavaBeans作为模型(Model)。 - ...
相比之下,Struts2.x提供了更为灵活的测试机制,可以通过Mock对象轻松地进行单元测试,同时也支持集成测试,提高了测试的便捷性和有效性。 #### 表单处理和数据绑定 Struts1.x使用ActionForm作为表单数据的容器,...
内容推荐 Struts是目前非常流行的基于MVC的Java ...第19章到第21章介绍了如何采用第三方软件,如Apache Common Logging API、Log4J、ANT和StrutsTestCase,来控制Struts应用的输出日志、管理以及测试Struts应用项目。
Struts是目前非常流行的基于MVC的Java Web框架。...第19章到第21章介绍了如何采用第三方软件,如Apache Common Logging API、Log4J、ANT和StrutsTestCase,来控制Struts应用的输出日志、管理以及测试Struts应用项目。
- **Struts2**:Action可以通过实例化进行测试,属性设置后直接调用方法,依赖注入使得测试更加容易。 5. **接受输入**: - **Struts1**:使用ActionForm对象捕获用户输入,ActionForm需要继承基类,有时会导致...
4. **StrutsTestCase**:StrutsTestCase是Struts提供的一个单元测试框架,它允许开发者对ActionForm、Action和ActionForward进行测试,确保这些组件在实际运行前功能正确。使用StrutsTestCase,可以编写模拟HTTP请求...
10. **测试与调试**:Struts 2提供了测试工具和API,如StrutsTestCase,便于开发者进行单元测试和集成测试。同时,其丰富的日志记录功能也有助于调试和诊断问题。 总之,Struts 2.5.12是一个功能强大且成熟的Web...