您的位置:首页 > 编程语言 > Java开发

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

2007-11-30 17:16 288 查看
 
[align=left]经过一周的摸索与学习,终于把Spring+Hibernate+Struts架构在MyEclipse的环境下搭建起来了,实际大部分时间都在用JUnit进行单元测试,真不容易呀。下面对我一周的学习情况进行一下总结,希望对想大家有所帮助。[/align]
[align=left] [/align]
[align=left]JUnit基础部分很好学,只要用模板复制就可以了。就不多说了,网上资料多的是。[/align]
[align=left] [/align]
[align=left]先说一下测试spring,因为Hibernate是在Spring封装的所以不用单独测试。[/align]
[align=left]首先让测试类继承org.springframework.test.AbstractTransactionalSpringContextTests,如[/align]
[align=left]Public class TestAccoutDAOImp extends AbstractTransactionalSpringContextTests{}[/align]
[align=left]先利用getConfigLocations()获得配置文件,但是在MyEclipse中applicationContext.xml等配置文件必须放在src下,放到WEB-INF下编译时提示找不到相关配置文件,真不爽,有谁有好的解决办法发个邮件告诉我一声,非常感谢。liweimilan@163.com[/align]
[align=left]public String[] getConfigLocations(){
String[] config = new String[]{"applicationContext.xml","applicationContext-hibernate.xml","applicationContext-service.xml"};
return config;
}[/align]
[align=left]因为所有有关spring的测试都要用到getConfigLocations(),所以可以编写一个父类,让其它的测试类继承它更方便一些,这是Pragmatic Unit Testing (in Java with JUnit)一书中推荐的一种方法,在父类中还可以再加入一些其它子类共有的方法。[/align]
[align=left]下面就是获得applicationContext这个变量了,
AccountDAO accountDAO = (AccountDAOImp)applicationContext.getBean("accountDAO");得到你的实例来进行业务逻辑测试了,它在此时完成以后会把数据库回滚一次,不会影响你的数据库记录,但要记住它是对数据库进行操作的,只是操作后回滚,在查询的时候可以体会到。[/align]
[align=left] [/align]
[align=left]现在说一下Struts 的测试,我的struts有一个基类叫BaseAction,[/align]
[align=left]publicclass BaseAction extends DispatchAction {[/align]
[align=left]       /*[/align]
[align=left]        * Generated Methods[/align]
[align=left]        */[/align]
[align=left]       private ServiceFactory service;[/align]
[align=left]       publicvoid setServlet(ActionServlet actionServlet) {[/align]
[align=left]              super.setServlet(actionServlet);[/align]
[align=left]              if (actionServlet != null) {[/align]
[align=left]                     ServletContext servletContext = actionServlet.getServletContext();[/align]
[align=left]                     WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);[/align]
[align=left]                     this.service = (ServiceFactory)wac.getBean("service");[/align]
[align=left]              }[/align]
[align=left]       [/align]
[align=left] [/align]
[align=left]       protected ServiceFactory getService() {[/align]
[align=left]                     returnservice;[/align]
[align=left]              }[/align]
[align=left]}[/align]
 
由它来获得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()方法
[align=left]publicvoid setUp() throws Exception {[/align]
[align=left]        super.setUp();[/align]
[align=left]        setContextDirectory(new File("WebRoot")); [/align]
[align=left]    JUnitHelper.setWebApplicationContext(getActionServlet().getServletContext());[/align]
[align=left]        setInitParameter("validating","false");[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]setContextDirectory(new File("WebRoot")),这个是在WebRoot下寻找struts-config.xml文件用的,在MyEclipse中很方便,网上说把WEB-INF copy到src下,但这个太麻烦了,而且很不容易和开发同步。注意此时的Struts-config.xml放在WEB-INF下,要放在其它地方,还得修改,具体就上网上找吧。[/align]
[align=left]JUnitHelper.setWebApplicationContext(getActionServlet().getServletContext()) 就是上面说的获得Spring的ApplicationContext。[/align]
[align=left]还有一点我的Action是用的是DispatchAction,测试中要加上[/align]
[align=left]addRequestParameter("method","logon")之类的东西[/align]
[align=left]之后的struts测试内容上网上找就可以了,有的是,关于StrutsTestCase的文章,http://www.360doc.com/showRelevantArt.aspx?ArticleID=134063 中有不少好文章可以参考。[/align]
[align=left]文章写得有些简单,内容有些少,只希望对大家有帮助,互相学习。[/align]
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息