使用JUnit在struts+spring+hibernate框架环境下进行单元测试
2012-12-25 00:13
761 查看
过往使用的方式从最原始的IDE的DEBUG工具断点查错到目前还在用最快捷的使用文字输出(log或system.out)。
这些调试方式不是说不好,但有些情况下达不到自己的需求,浪费了一些时间,因为在SSH的环境下修改的源码就意味着要部署。
有个误区,有的人认为把ApplicationServer的热部署方式设置为ture,就不用部署了。其实实际还是重新部署了一遍,只是不需要你按键罢了。
而且这样的后果还是你每保存一下就帮你部署一次,项目大的话花费很更多,我想也有不少人知道有个内存溢出的问题...挺头痛的..
之前偶尔接触到JUnit,才领略到单元测试的精辟,记录一下学习心得。请别笑学得晚,最近也有个TestNG,有时间也继续研究下。学习调试程序也是一门学问啊。
好啦,言归正传并且长话短说。
使用JUnit进行单元测试方法,初步介绍。
导入JUnit的包就不多说了,一般的IDE都集成的了。
首先建议大家如果想使用Main静态方法来进行调试的话,请直接使用JUnit吧。使用方法很简单,如下:
Java代码
@Test
public void test1() {
System.out.println("Hello World!");
}
其实这个是生命周期的标记,@Before为执行@Test方法之前先执行的,而@After就是执行完@Test之后执行,比较好理解。如果想不执行的话直接把标记注释掉即可,快捷简单。
执行添加了@Test的方法也简单,由于我是使用MyEclipse的关系,这里以它来举例。其实跟执行Main方法差不多在运行里面选择JUnit调试的选项。快捷键:Alt+Shift+X,T,但我更喜欢在代码上面右键然后选择运行JUnit测试。
在传统的三层架构中进行单元测试
DAO层和业务逻辑层的调试
首先在@Before标记上执行获取需要调试的单元所使用的bean。
具体例子如:
Java代码
private IMailboxDAO MailboxDAOImpl;
@Before
public void init() {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
BeanFactory factory = (BeanFactory) context;
MailboxDAOImpl = (IMailboxDAO) factory.getBean("mailboxDAOImpl");
}
@Test
publiv void testSave(){
Bean transientInstance = new Bean();
...
MailboxDAOImpl.save(transientInstance);
}
获取BeanFactory的方法有多种,这里比较推荐使用这种方法。注意这里的applicationContext.xml是放在classPath之下,也推荐放在这里,比较好调试。
view层的调试
在我的应用中,view层使用的是struts1.29的技术,其实际上也没用到什么,仅仅作为servlet来使用罢了。而且struts的标记库也实在太啰嗦了,所以我前端使用的技术是AJAX+JSON+Struts.
JavaScript就不用多说了,必定需要的了,而这里不推荐使用DWR框架,当然如果对JavaScript不熟的话也没办法了。总之还是王道的那句:使用什么技术还是取决与实际项目情况。
说这些的原因是告诉大家,struts所用到的from、forward之类的我都没调试了,后续描述一下。
首先想调试struts,使用到的技术是StrutsTestCase。具体地址http://sourceforge.net/projects/strutstestcase/
需要记住的是,StrutsTestCase是Junit TestCase类的扩展。
使用方法,例子如下:
首先把单元测试类继承servletunit.struts.MockStrutsTestCase
然后模拟容器,具体请查看以下
Java代码
/**
* 加载模拟容器
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
super.setUp();
File context = new File("WebRoot");
setContextDirectory(context);
}
注意setContextDirectory方法,默认情况下setUp()方法会在classPath下找web.xml和struts-config.xml等配置文件,所以可能会遇到找不到的情况。
使用setContextDirectory并且设置File为"WebRoot"的话,告诉程序在WebRoot下找配置文件,在SSH通常情况下都适用。
准备功夫做好了就可以尽情的进行测试了,并不用担心修改代码后需要重新部署项目了。
这里注意的时,在继承了MockStrutsTestCase的子类当中,所有以test开头的方法都自动执行调试程序,不再需要@Test标记。这里有保留意见,双利刃吧,还是喜欢用标记进行测试。
例子如下:
Java代码
public void testToPageGoMembershipByDl() {
String actionUri = "/distributionList/bin/get_members";
String parameterKey1 = "toPage";
String parameterKey2 = "dlId";
String toPageGoStr = "1";
String dlId = "402881b6200d287101200d69838f0009";
Map<String, Object> urlMap = new HashMap<String, Object>();
urlMap.put(parameterKey1, toPageGoStr);
urlMap.put(parameterKey2, dlId);
generateRequestParameters(urlMap);
setRequestPathInfo(actionUri);//设置request的请求
actionPerform();//执行请求
}
//公共方法,封装url的parameters请求
public void generateRequestParameters(Map<String, Object> parameters) {
if ((parameters != null) && (!parameters.isEmpty())) {
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
String[] parameterValues = null;
if (value instanceof String) {
parameterValues = new String[] { (String) value };
} else if (value instanceof String[]) {
parameterValues = (String[]) value;
}
if (parameterValues != null)
addRequestParameter(key, parameterValues);//增加request参数
}
}
}
当然JUnit没这么简单,但我使用到的这些足够了,其他的还可以使用断言(assert)来辅助大家调试。给大家举一些例子,当中都为网上整理出来。
主要函数和作用
setRequestPathInfo,设置request的请求
addRequestParameter,将参数和对应的值加入request中
actionPerform,执行这个请求
verifyForward,验证forward的名字是否正确
verifyForwardPath,验证forward的path是否正确
verifyNoActionErrors,验证在action执行过程中没有ActionError产生
verifyActionErrors,验证在action执行过程中产生的ActionError集合的内容
如果你action里面有setAttribute之类的方法,也想验证的话。
也可以通过getSession()方法来获取session(request类似)。
跟着再使用getAttribute进行assert就可以组合成自己需要的调试单元了。顺便列举一下assert方法。
assertEquals(), assertNull(), assertSame(), assertTrue(),assertArrayEquals()等..
无论如何,如果你不喜欢使用assert方法,直接输出一下也十分便捷。
希望对大家学习有帮助。
这些调试方式不是说不好,但有些情况下达不到自己的需求,浪费了一些时间,因为在SSH的环境下修改的源码就意味着要部署。
有个误区,有的人认为把ApplicationServer的热部署方式设置为ture,就不用部署了。其实实际还是重新部署了一遍,只是不需要你按键罢了。
而且这样的后果还是你每保存一下就帮你部署一次,项目大的话花费很更多,我想也有不少人知道有个内存溢出的问题...挺头痛的..
之前偶尔接触到JUnit,才领略到单元测试的精辟,记录一下学习心得。请别笑学得晚,最近也有个TestNG,有时间也继续研究下。学习调试程序也是一门学问啊。
好啦,言归正传并且长话短说。
使用JUnit进行单元测试方法,初步介绍。
导入JUnit的包就不多说了,一般的IDE都集成的了。
首先建议大家如果想使用Main静态方法来进行调试的话,请直接使用JUnit吧。使用方法很简单,如下:
Java代码
@Test
public void test1() {
System.out.println("Hello World!");
}
其实这个是生命周期的标记,@Before为执行@Test方法之前先执行的,而@After就是执行完@Test之后执行,比较好理解。如果想不执行的话直接把标记注释掉即可,快捷简单。
执行添加了@Test的方法也简单,由于我是使用MyEclipse的关系,这里以它来举例。其实跟执行Main方法差不多在运行里面选择JUnit调试的选项。快捷键:Alt+Shift+X,T,但我更喜欢在代码上面右键然后选择运行JUnit测试。
在传统的三层架构中进行单元测试
DAO层和业务逻辑层的调试
首先在@Before标记上执行获取需要调试的单元所使用的bean。
具体例子如:
Java代码
private IMailboxDAO MailboxDAOImpl;
@Before
public void init() {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
BeanFactory factory = (BeanFactory) context;
MailboxDAOImpl = (IMailboxDAO) factory.getBean("mailboxDAOImpl");
}
@Test
publiv void testSave(){
Bean transientInstance = new Bean();
...
MailboxDAOImpl.save(transientInstance);
}
获取BeanFactory的方法有多种,这里比较推荐使用这种方法。注意这里的applicationContext.xml是放在classPath之下,也推荐放在这里,比较好调试。
view层的调试
在我的应用中,view层使用的是struts1.29的技术,其实际上也没用到什么,仅仅作为servlet来使用罢了。而且struts的标记库也实在太啰嗦了,所以我前端使用的技术是AJAX+JSON+Struts.
JavaScript就不用多说了,必定需要的了,而这里不推荐使用DWR框架,当然如果对JavaScript不熟的话也没办法了。总之还是王道的那句:使用什么技术还是取决与实际项目情况。
说这些的原因是告诉大家,struts所用到的from、forward之类的我都没调试了,后续描述一下。
首先想调试struts,使用到的技术是StrutsTestCase。具体地址http://sourceforge.net/projects/strutstestcase/
需要记住的是,StrutsTestCase是Junit TestCase类的扩展。
使用方法,例子如下:
首先把单元测试类继承servletunit.struts.MockStrutsTestCase
然后模拟容器,具体请查看以下
Java代码
/**
* 加载模拟容器
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
super.setUp();
File context = new File("WebRoot");
setContextDirectory(context);
}
注意setContextDirectory方法,默认情况下setUp()方法会在classPath下找web.xml和struts-config.xml等配置文件,所以可能会遇到找不到的情况。
使用setContextDirectory并且设置File为"WebRoot"的话,告诉程序在WebRoot下找配置文件,在SSH通常情况下都适用。
准备功夫做好了就可以尽情的进行测试了,并不用担心修改代码后需要重新部署项目了。
这里注意的时,在继承了MockStrutsTestCase的子类当中,所有以test开头的方法都自动执行调试程序,不再需要@Test标记。这里有保留意见,双利刃吧,还是喜欢用标记进行测试。
例子如下:
Java代码
public void testToPageGoMembershipByDl() {
String actionUri = "/distributionList/bin/get_members";
String parameterKey1 = "toPage";
String parameterKey2 = "dlId";
String toPageGoStr = "1";
String dlId = "402881b6200d287101200d69838f0009";
Map<String, Object> urlMap = new HashMap<String, Object>();
urlMap.put(parameterKey1, toPageGoStr);
urlMap.put(parameterKey2, dlId);
generateRequestParameters(urlMap);
setRequestPathInfo(actionUri);//设置request的请求
actionPerform();//执行请求
}
//公共方法,封装url的parameters请求
public void generateRequestParameters(Map<String, Object> parameters) {
if ((parameters != null) && (!parameters.isEmpty())) {
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
String[] parameterValues = null;
if (value instanceof String) {
parameterValues = new String[] { (String) value };
} else if (value instanceof String[]) {
parameterValues = (String[]) value;
}
if (parameterValues != null)
addRequestParameter(key, parameterValues);//增加request参数
}
}
}
当然JUnit没这么简单,但我使用到的这些足够了,其他的还可以使用断言(assert)来辅助大家调试。给大家举一些例子,当中都为网上整理出来。
主要函数和作用
setRequestPathInfo,设置request的请求
addRequestParameter,将参数和对应的值加入request中
actionPerform,执行这个请求
verifyForward,验证forward的名字是否正确
verifyForwardPath,验证forward的path是否正确
verifyNoActionErrors,验证在action执行过程中没有ActionError产生
verifyActionErrors,验证在action执行过程中产生的ActionError集合的内容
如果你action里面有setAttribute之类的方法,也想验证的话。
也可以通过getSession()方法来获取session(request类似)。
跟着再使用getAttribute进行assert就可以组合成自己需要的调试单元了。顺便列举一下assert方法。
assertEquals(), assertNull(), assertSame(), assertTrue(),assertArrayEquals()等..
无论如何,如果你不喜欢使用assert方法,直接输出一下也十分便捷。
希望对大家学习有帮助。
相关文章推荐
- 在Myeclipse里使用Junit贴图教程与使用JUnit在struts+spring+hibernate框架环境下进行单元测试
- 使用JUnit在struts+spring+hibernate框架环境下进行单元测试
- 使用JUnit在struts+spring+hibernate框架环境下进行单元测试
- 使用JUnit在struts+spring+hibernate框架环境下进行单元测试
- 使用JUtil在struts+spring+hibernate框架环境下进行单元测试
- 使用struts、hibernate、spring进行框架整合流程详细说明(完整版)附:开发规范
- 使用struts、hibernate、spring进行框架整合流程详细说明(完整版)
- Spring整合JUnit框架进行单元测试代码使用详解
- Spring整合JUnit框架进行单元测试代码使用详解
- 使用MyEclipse整合ssh(Struts、Spring、Hibernate)三大框架(环境搭载+实例源码下载)
- Spring整合JUnit框架进行单元测试代码使用详解
- Spring整合JUnit框架进行单元测试代码使用详解
- 使用struts、hibernate、spring进行框架整合流程详细说明(完整版)附:开发规范
- 使用MyEclipse整合ssh(Struts、Spring、Hibernate)三大框架(环境搭载+实例源码下载)
- 使用struts、hibernate、spring进行框架整合流程详细说明(完整版)附:开发规范
- 使用struts、hibernate、spring进行框架整合流程详细说明
- 使用MyEclipse整合ssh(Struts、Spring、Hibernate)三大框架(环境搭载+实例源码下载)
- Spring整合JUnit框架进行单元测试代码使用详解
- 使用struts、hibernate、spring进行框架整合流程详细说明
- maven下使用junit对spring进行单元测试_01基本应用