经过一周的摸索与学习,终于把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;
}
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"); 得到你的实例来进行业务逻辑测试了,它在此时完成以后会把数据库回滚一次,不会影响你的数据库记录,但要记住它是对数据库进行操作的,只是操作后回滚,在查询的时候可以体会到。
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
中有不少好文章可以参考。
文章写得有些简单,内容有些少,只希望对大家有帮助,互相学习。