`
zhangjunji111
  • 浏览: 48004 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring与Struts结合测试的问题解答

阅读更多

 JDK1.6都出来好长时间了,可我现在公司开发用的还是jdk1.4,说是稳定,另外一个,公司的用户都不愿意花钱升级自己的应用服务器,所以,我们只能在JDK1.4下面开发。另外公司的架构是一个技术牛人写的,采用Struts1.2+spring2.0,前台JSP页面展示采用一套自己的验证,数据传递到后台以及持久层都是那个牛人写的,公用框架没问题,也比较好用,但是缺乏测试。
  我针对持久层写了一些测试,但是对struts的Action层一直没有测试,从网上搜索出来的东西,大都是专门真么SPring或者专门针对Struts的,或者有针对Spring+struts的,但是就一个简单的Demo,对于路径问题,还是没有解决,总是报404或者其他的错误,最终花了好几天的时间,才搞定这个问题,特写博客记录一下,也希望能给有需要这方面东西的朋友提供个帮助。
  其实例子就是简单的一个登录功能,登录成功后进入dwgl模块,包含两个struts的action类,一个在根目录下,一个在dwgl路径下。
web.xml主要配置如下:

<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/config/struts-config.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/dwgl</param-name>
   <param-value>/WEB-INF/config/struts-config-dwgl.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>

 


其中Spring通过Struts的ContextLoaderPlugIn插件形式加载,项目中有连个Struts的配置文件以及两个spring的配置文件,都存放在WEB-INF/config/目录下面,文件名分别是struts-config.xml、struts-config-dwgl.xml、applicationContext.xml、applicationContext-dwgl.xml。

struts-config.xml内容如下:

<struts-config>
<action-mappings>
 <action input="/login.jsp" path="/login"
  type="org.springframework.web.struts.DelegatingActionProxy">
  <forward name="success" path="/WEB-INF/jsp/success.jsp" />
 </action>
 </action-mappings>
 <message-resources
  parameter="com.accp.web.struts.ApplicationResources" />

   
<!-- 注意,加载Spring插件contextConfigLocation参数必须写成下面的形式,即多个参数之间用逗号隔开,
如果写成applicationContext*.xml的形式,对action层进行测试时候会出现空指针的错误 -->
 <plug-in
  className="org.springframework.web.struts.ContextLoaderPlugIn">
  <set-property property="contextConfigLocation"
   value="/WEB-INF/config/applicationContext.xml,/WEB-INF/config/applicationContext-dwgl.xml" />
 </plug-in>



</struts-config>

 

 struts-config-dwgl.xml内容如下:

<struts-config>
 <action-mappings>
  <action path="/dwgl" parameter="method"
   type="org.springframework.web.struts.DelegatingActionProxy">
   <forward name="success" path="/WEB-INF/jsp/success.jsp" />
  </action>
 </action-mappings>
</struts-config>

  

applicationContext.xml内容如下:

<beans> 
   <bean name="/login" class="com.accp.web.struts.action.LoginAction"/>
</beans>

 

applicationContext-dwgl.xml内容如下:

<beans> 
   <bean name="/dwgl/dwgl" class="com.accp.web.struts.action.dwgl.DwglAction"/>
</beans>

 

 

 

 

具体loginAction内容就是一个简单的提交,

java代码:

public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  String userName = request.getParameter("userName");
  ActionMessages errors = new ActionMessages();
  if (userName == null || userName.length() == 0) {
   errors.add("userName", new ActionMessage("errors.userName"));
  }
  if (errors.size() > 0) {
   saveErrors(request, errors);
   return mapping.getInputForward();
  }
  request.setAttribute("userName", userName);
  return mapping.findForward("success");
 }

 

dwglAction继承DispatchAction,内容如下:

public class DwglAction extends DispatchAction {

 public ActionForward querydw(ActionMapping arg0, ActionForm arg1,
   HttpServletRequest arg2, HttpServletResponse arg3) throws Exception {
  return null;
 }
}

 

 

 

 

在这里我只想测试能不能执行到方法内部,所以方法里面也没有什么逻辑处理。

完了写LoginAction的测试,继承自MockStrutsTestCase,但是由于action是Spring进行管理的,所以要写一个将Spring的webapplicationcontext添加到servletcontex中,这里通过SpringWebContextHelper类完成,具体内容为:

public class SpringWebContextHelper {
 private static XmlWebApplicationContext wac = null;
 public static void setWebApplicationContext(ServletContext context) {

  if (context
    .getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {
   return;
  }
  if(wac == null){
   wac =  new XmlWebApplicationContext();
   wac.setServletContext(context);
   URL classUrl = SpringWebContextHelper.class.getResource("");
   String path = classUrl.getPath();
   try {
    path = URLDecoder.decode(path, "UTF-8");
   } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
   }
   path = path.substring(0 , path.indexOf("WEB-INF")) + "WEB-INF/";
   File configPath = new File(path + "config/");
   String[] applicationContexts = configPath.list(new FilenameFilter(){
    public boolean accept(File dir, String name){
     if(name.toLowerCase().startsWith("applicationcontext")){
      return true;
     }
     return false;
    }    
   });   
   for(int i=0;i<applicationContexts.length;i++){
    applicationContexts[i] = path + "config/" + applicationContexts[i];
   }
   wac.setConfigLocations(applicationContexts);
   wac.refresh();
  }  

  context.setAttribute(
    WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
    wac);
 }

}

 

 

 LoginActionTest 类代码如下:具体注释写的很清楚,大家一看就明白,

 

public class LoginActionTest extends MockStrutsTestCase {

 public void setUp() throws Exception
 {
  super.setUp(); //调用父类的setUp() 
  setContextDirectory(new File("WebRoot")); //指定上下文目录(WEB-INF的父目录)
//  this.setConfigFile("/WEB-INF/config/struts-config.xml,/WEB-INF/config/struts-config-dwgl.xml");
  this.setConfigFile("/WEB-INF/config/struts-config.xml");
  this.setConfigFile("dwgl","/WEB-INF/config/struts-config-dwgl.xml");
  SpringWebContextHelper.setWebApplicationContext(context);
 }
 
 //验证1:在给出正确参数的前提下,是否会返回名为success的ActionForward,以及作用域中是否有正确的数据?
 public void testSuccess()
 {
  //选择要执行哪一个Action
  this.setRequestPathInfo("/login.do");
  //指定请求参数
  this.addRequestParameter("userName", "ACCP");
  //下面这个方法其实就是调用Action中的execute()方法,呵呵。
  this.actionPerform();
  //验证返回是否正确(登录名不为空,应该返回"success")
  this.verifyForward("success");
  //验证“作用域”中的数据是否符合要求
  String expected = "ACCP";
  Object actual = this.getRequest().getAttribute("userName");
  assertEquals(expected, actual);
 }
 
 //验证2:在不给参数的前提下,是否会返回相关的错误消息?
 public void testFailure()
 {
  this.setRequestPathInfo("/login.do");
  this.actionPerform();
  
  this.verifyInputForward();
  
  this.verifyActionErrors(new String[]{ "errors.userName" });
 }
}

 

 

 

由于dwglaction继承自 DispatchAction ,并且在dwgl模块下,所以测试类路径设置以及方法设置要复杂一点,具体代码如下:

public class DwglActionTest extends MockStrutsTestCase {
 public void setUp() throws Exception {
  super.setUp(); // 调用父类的setUp()
  setContextDirectory(new File("WebRoot/")); // 指定上下文目录(WEB-INF的父目录)
  String configfilePath = "/WEB-INF/config/struts-config.xml";
  this.setConfigFile(configfilePath);
  //第一个参数子项目的配置文件,不能以"/"开头
  this.setConfigFile("dwgl","/WEB-INF/config/struts-config-dwgl.xml");
  SpringWebContextHelper.setWebApplicationContext(context);
  setInitParameter("validating","false");
 }
 public void testGetMessage() {
  // 选择要执行哪一个Action,其中第一个参数用来标识子项目,切记必须以“/”开头
  this.setRequestPathInfo("/dwgl","/dwgl.do");
  this.addRequestParameter("method", "querydw");
  this.actionPerform();
 }
 public static void main(String[] args){
  }
}

 

 

 

 

现在写完这些测试方法,感觉好简单,可当时却折磨得我好苦,花了好几天的时间才完成这些测试,当时由于一个路径设置的问题,junit的进度条就是不能变绿,等到最后完成这些测试、进度条变绿,我才舒了一口气,希望对需要的朋友有一些帮助。

附件为所有的源代码,不过由于lib文件太大,我没有进行上传,具体需要以下jar包,log4j、struts、spring、strutstest。

0
1
分享到:
评论
1 楼 zhangjunji111 2009-07-21  
昨天在公司测试Struts时候,在Cactus环境下测试,结果一直报一个类型转化的错误,说一个什么类不能转化为WebApplicationcontext类,我的系统采用Spring+struts开发,其中调用了Xfire。估计是Xfire在捣鬼,不过还没有解决的办法,希望有了解的朋友帮忙解答一下了。

相关推荐

    spring_struts整合jar包

    2. **Spring MVC与Struts2的集成**:虽然两者都有MVC模式,但在整合时,通常会使用Struts2来处理请求的路由和响应,而Spring MVC则处理更复杂的视图解析和数据绑定。 3. **Spring事务管理**:Spring提供了强大的...

    spring与struts2集成所需要的jar包

    集成Spring和Struts2的好处在于,Spring可以帮助管理Struts2的Action和业务逻辑,实现松耦合和更好的测试性。同时,Struts2的MVC模型和丰富的插件系统可以提供优雅的用户界面和交互控制。这样的结合,不仅提升了开发...

    Spring和Struts整合用到的jar包

    通过以上步骤,我们可以成功地将Spring的IoC和AOP特性与Struts的MVC架构结合,构建出一个灵活、可扩展的Java Web应用。不过,随着技术的发展,Spring Boot的出现让整合变得更加简单,同时Spring MVC也逐渐取代了...

    Spring+Struts+mybatis

    5. **整合SSM**:将Spring的IoC容器与Struts的ActionContext相结合,使Spring管理Struts的Action实例。同时,MyBatis与Spring集成,通过Spring的SqlSessionFactoryBean来创建SqlSessionFactory。 6. **编写业务逻辑...

    spring &struts整合

    - **结果映射**:Spring MVC 的 ViewResolver 可以与 Struts2 结合,实现更灵活的视图解析。 4. **整合步骤**: - 引入相关库:添加 Spring 和 Struts2 相关的 JAR 包到项目中。 - 配置 Spring:编写 Spring 的...

    Spring + struts2

    整合Spring和Struts2的主要目的是利用两者的优点,将Spring的DI和AOP特性与Struts2的MVC架构结合,构建出更加灵活、可扩展的应用。以下是整合步骤: 1. **配置Struts2**:首先,我们需要在项目中引入Struts2的库,...

    spring+struts2+mybatis jar包

    它与Spring结合时,可以将Action类作为Spring的bean管理,实现服务的注入,提高代码的可测试性和可维护性。 **MyBatis框架**是一个轻量级的持久层框架,它将SQL语句与Java代码分离,通过XML或注解的方式配置映射...

    Struts,Spring登陆

    6. **视图渲染**:如果登陆成功,Struts的Action会将控制权交给Spring MVC的视图解析器,如JSP或FreeMarker,来展示欢迎页面或者其他用户权限允许的内容。 7. **测试**:由于Spring的依赖注入特性,我们可以很容易...

    org.springframework.web.struts-sources-3.0.4.RELEASE.jar

    《Spring与Struts整合:深入理解org.springframework.web.struts-sources-3.0.4.RELEASE.jar》 在Java Web开发领域,Spring框架以其强大的依赖注入和面向切面编程能力,而Struts则以其优秀的MVC架构模式,共同构建...

    Spring整合Struts2

    Spring整合Struts2是Web开发领域中常见的技术组合,它结合了Spring的强大 IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)功能,以及Struts2的MVC(Model-View-...

    开发Spring.Struts.Hibernate应用

    Struts 2与Spring的结合,可以实现对业务对象的管理,利用Spring的DI特性,使得Struts 2的Action类可以方便地获取和管理依赖。同时,Struts 2还支持多种视图技术,如JSP、FreeMarker,提高了视图层的灵活性。 ...

    spring+struts集成学习笔记和项目源码

    2. **Spring与Struts的拦截器集成**:Spring AOP的拦截器可以与Struts的拦截器结合,提供更灵活的请求处理和业务逻辑控制。 3. **事务管理**:Spring 提供的声明式事务管理可以无缝集成到Struts应用中,简化了事务...

    MVC注解Spring-Struts2Spring2hibernate3

    本项目“MVC注解Spring-Struts2Spring2hibernate3”结合了Spring、Struts2和Hibernate3这三大框架,以注解的方式实现了一个完整的MVC解决方案。下面将详细介绍这三个框架以及它们之间的协作。 首先,Spring框架是...

    搭建SSH框架需要引入的Struts2包(log4j,spring-web,struts2-spring-plugin)

    对于Struts2和Spring的配置,我们需要在`struts.xml`和`spring-context.xml`文件中进行相应的设置,例如定义Action类、配置Spring Bean以及指定Struts2与Spring的整合方式。同时,确保web.xml文件中配置了...

    Spring+Struts+Hibernate比较详细的整合配置方案

    在Spring与Struts整合时,Spring可以作为Action的工厂,实现Action的依赖注入,提高代码的可测试性和可维护性。 Hibernate框架则是ORM的代表,它通过XML或注解方式将Java类与数据库表关联起来,使得开发者可以像...

    struts2.0 spring2.0 hibernate3.0整合开发快速入门-3

    ### Struts2.0、Spring2.0与Hibernate3.0整合开发快速入门知识点解析 #### 一、Struts2.0与Hibernate3.0整合基础 **知识点1:Struts2.0简介** - **定义**: Struts2是Apache基金会下的一个开源项目,它是一个基于...

    spring+struts+Hibernate面试题

    - **使用 Spring 与 Struts 结合**:Spring 可以与 Struts 结合使用,例如通过 Spring 管理 Struts 的 Action 实例。 - **集成优势**: - **松耦合**:通过依赖注入(DI)减少对象间的耦合度。 - **可测试性增强*...

    mock struts1 测试

    在传统的Struts1应用程序中,Action类往往需要与`HttpServletRequest`和`HttpServletResponse`对象交互,这使得直接对Action类进行单元测试变得非常困难。因此,引入Mock技术就显得尤为重要。通过模拟`...

Global site tag (gtag.js) - Google Analytics