Struts+Spring+Hibernate架构下的单元测试

 

经过一周的摸索与学习,终于把Spring+Hibernate+Struts架构在MyEclipse的环境下搭建起来了,实际大部分时间都在用JUnit进行单元测试,真不容易呀。下面对我一周的学习情况进行一下总结,希望对想大家有所帮助。
 
JUnit基础部分很好学,只要用模板复制就可以了。就不多说了,网上资料多的是。
 
先说一下测试spring,因为Hibernate是在Spring封装的所以不用单独测试。
首先让测试类继承org.springframework.test.AbstractTransactionalSpringContextTests,如
Public class TestAccoutDAOImp extends AbstractTransactionalSpringContextTests{}
先利用 getConfigLocations() 获得配置文件,但是在 MyEclipse applicationContext.xml 等配置文件必须放在 src 下,放到 WEB-INF 下编译时提示找不到相关配置文件,真不爽,有谁有好的解决办法发个邮件告诉我一声,非常感谢。 liweimilan@163.com
public String[] getConfigLocations(){
String[] config = new String[]{"applicationContext.xml","applicationContext-hibernate.xml","applicationContext-service.xml"};
return config;
}
因为所有有关 spring 的测试都要用到 getConfigLocations() ,所以可以编写一个父类,让其它的测试类继承它更方便一些,这是 Pragmatic Unit Testing (in Java with JUnit) 一书中推荐的一种方法,在父类中还可以再加入一些其它子类共有的方法。
下面就是获得 applicationContext 这个变量了,
AccountDAO accountDAO = (AccountDAOImp)applicationContext.getBean("accountDAO");
得到你的实例来进行业务逻辑测试了,它在此时完成以后会把数据库回滚一次,不会影响你的数据库记录,但要记住它是对数据库进行操作的,只是操作后回滚,在查询的时候可以体会到。
 
现在说一下 Struts 的测试,我的 struts 有一个基类叫 BaseAction,
public class BaseAction extends DispatchAction {
       /*
        * Generated Methods
        */
       private ServiceFactory service ;
       public void setServlet(ActionServlet actionServlet) {
              super .setServlet(actionServlet);
              if (actionServlet != null ) {
                     ServletContext servletContext = actionServlet.getServletContext();
                     WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
                     this . service = (ServiceFactory)wac.getBean( "service" );
              }
      
 
       protected ServiceFactory getService() {
                     return service ;
              }
}
 
由它来获得 Spring 的配置文件,要记住在 web.xml 中要进行配置,
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
 
<servlet>
 <servlet-name>context</servlet-name>
 <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>
也可用<listener>,为了这个我郁闷了一天,另外还有MyEclipse中没有导入commons-beanutils-1.7.0.jar的包,要手动导入,否则会出现莫明其妙的错误。
 
 
/* 注明以下摘自网络,具体内容可访问http://www.cjsdn.com/post/print?bid=7&id=106937 */
主要问题就是要提供一个 ApplicationContext 为 TestCase 调用,这样我们引用了一个 JUnitHelper 工具类进行相关 Spring 的操作,如提供 ApplicationContext 环境 , 下面我们就实现类测试和 Action 类测试进行一下讲解,其中数据库连接由 spring 控制。在 MockStrutsTestCase 的 setup 方法中,我们进行绑定操作: JUnitHelper.setWebApplicationContext(getActionServlet().getServletContext()) ; 余下的测试就是标准的 strutstestcase 的测试方法。
JUnitHelper 的源代码如下:
package test.struts.action;
 
/*
 * Copyright (c) 2004 Your Corporation. All Rights Reserved.
 */
 
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
 
import javax.servlet.ServletContext;
 
/**
 * junit测试的工具类
 * Date: 2004-4-20
 *
 * @author <a href="mailto:linux_china@hotmail.com">chenlibing</a>
 */
public class JUnitHelper
{
    /**
     * 项目基准路径
     */
      public static String BASE_DIRECTORY = "D:/project/src";
    /**
     * spring基本配置文件相对路径
     */
    public static String[] Configuration_Location = new String[]{BASE_DIRECTORY + "/applicationContext.xml"};
    private static XmlWebApplicationContext wac = null;
    private static FileSystemXmlApplicationContext fsxac = null;
 
    /**
     * 设置WebApplicationContext
     *
      * @param context ServletContext变量
     */
    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);
            wac.setConfigLocations(Configuration_Location);
            wac.refresh();
        }
        context.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);
    }
 
    /**
     * 获取文件方式的ApplicationContext
     *
     * @return ApplicationContext变量
     */
    public static ApplicationContext getApplicationContext()
    {
        if (fsxac == null)
        {
            fsxac = new FileSystemXmlApplicationContext(Configuration_Location);
        }
        return fsxac;
    }
}
/***********************************************************************/
 
下面再说一下利用StrutsTestCase测试Struts的Action
首先让测试类继承 import  servletunit.struts.MockStrutsTestCase
接着是 setUp ()方法
public void setUp() throws Exception {
        super .setUp();
        setContextDirectory( new File( "WebRoot" ));
    JUnitHelper.setWebApplicationContext(getActionServlet().getServletContext());
        setInitParameter( "validating" , "false" );
 }
 
setContextDirectory( new File( "WebRoot" )) ,这个是在 WebRoot 下寻找 struts-config.xml 文件用的, MyEclipse 中很方便,网上说把 WEB-INF copy src 下,但这个太麻烦了,而且很不容易和开发同步。注意此时的 Struts-config.xml 放在 WEB-INF 下,要放在其它地方,还得修改,具体就上网上找吧。
JUnitHelper.setWebApplicationContext(getActionServlet().getServletContext()) 就是上面说的获得 Spring ApplicationContext 。
还有一点我的 Action 是用的是 DispatchAction ,测试中要加上
addRequestParameter("method","logon") 之类的东西
之后的 struts 测试内容上网上找就可以了,有的是,关于 StrutsTestCase 的文章, http://www.360doc.com/showRelevantArt.aspx?ArticleID=134063  中有不少好文章可以参考。
文章写得有些简单,内容有些少,只希望对大家有帮助,互相学习。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值