1、之前我们的项目struts2版本是使用struts2.1.18,他使用struts2-junit-pugin-2.1.8.1.jar进行测试的时候完全可以,而且很方便,参考地址,http://gsdhaiji-cai.iteye.com/blog/1404230
2、坑爹的是,在一个旧的系统中,同样导入struts2-junit-pugin-2.1.8.1.jar,发现不行,后来跟踪了一下源码才发现:
struts2版本是2.0.11存在:strutsTestCase这个类,它与struts2-junit-pugin-2.1.8.1.jar中strutsTestCase类冲突,而且连包名都相同,导致struts2-junit-pugin-2.1.8.1.jar这个包中的StrutsTestCase无法使用,后来直接换掉其他方式来测试。ps:有谁能告诉我方法,在struts2 2.0.11版本直接使用struts2-junit-pugin,小弟不胜感激,必定以身相许:)
3、使用了EasyMock方法处理[1],下载地址是
http://sourceforge.net/projects/easymock/files/EasyMock/
4、后来发现运行时候有一个问题,如下
java.lang.NoClassDefFoundError: org/objenesis/ObjenesisHelper
at org.easymock.internal.ObjenesisClassInstantiator.newInstance
需要下载下面一个jar包,
http://code.google.com/p/objenesis/downloads/detail?name=objenesis-1.1.jar&can=2&q=
5、例子:
1、测试基类BaseAcionTest.java(其他action的测试类,都是继承他)
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.easymock.EasyMock;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class BaseActionTest {
protected ApplicationContext context;
protected HttpServletRequest request;
protected HttpServletResponse response;
BaseAction baseAction;
public BaseActionTest() {
context = new FileSystemXmlApplicationContext("classpath*:applicationContext-test.xml");
this.request = EasyMock.createMock(HttpServletRequest.class);
this.response = EasyMock.createMock(HttpServletResponse.class);
ServletActionContext.setRequest(request);
ServletActionContext.setResponse(response);
}
}
2、某一个测试类
@Test
public void testSave() throws IOException {
//预期设置阶段record阶段,模拟一些初始动画
//这一步已经在父类中定义了,他依赖与request的初始化//需要下面这样传递参数才行
//直接使用request.addParameter();不行
//这面这个方法,是可以避免测试程序调用ajax方法,我们直接告诉他这个方法的返回值是什么,省去ajax调用,这里注释掉
//NetStandardAction netStandardAction = EasyMock.createMockBuilder(NetStandardAction.class).addMockedMethod("ajax").createMock();
NetStandardAction netStandardAction = new NetStandardAction();
EasyMock.expect(request.getParameter("name")).andReturn("hello");
EasyMock.expect(request.getParameter("netStandardId")).andReturn("");
this.request.setAttribute("ajaxInfo", "success");
EasyMock.expectLastCall();
//EasyMock.expect(netStandardAction.ajax("success")).andReturn("ajax");
//repay,你要测试的对象放在这里,在这个阶段将record阶段的录制操作,重新运行一遍
netStandardAction.setNetStandardService((NetStandardService)context.getBean("netStandardService"));
EasyMock.replay(this.request);
//EasyMock.replay(netStandardAction);
String result = netStandardAction.saveNetStandard();
//verify阶段,用来验证我们的测试结果与交互
//调用了junit进行结果判断
//Assert.assertEquals("保存成功", "ajax", result);
//验证request是否按照record阶段模拟运行了
EasyMock.verify(this.request);
//EasyMock.verify(netStandardAction);
}
3、NetStandardAction类:
//此类需要spring注入netStandardService
public String saveNetStandard(){
String netStandardId=getParam("netStandardId");
String name=getParam("name");
if(isEmpty(netStandardId)){
NetStandard netStandard=new NetStandard();
netStandard.setName(name);
netStandardService.save(netStandard);
}else{
NetStandard netStandard=netStandardService.get(NetStandard.class,Integer.valueOf(netStandardId));
netStandard.setName(name);
netStandardService.update(netStandard);
}
return ajax(SUCCESS);
}
4、上面中的ajax方法
//这里的getRequest是获取当前request对象
public String ajax(String info) {
getRequest().setAttribute("ajaxInfo",info);
return "ajax";
}
5、总结一下:
首先感谢参考资料中的作者,他的文档太给力了:)
需要明白以下内容:
record->replay->verify这个过程
谁要事先录制(依赖的对象——次要测试对象,你用mock来模拟),测试对象(主要测试对象)
对于方法调用的顺序,要看:strict和nice这一节
对于有返回值和没有返回值,你需要怎么写
参考资料:
[1]:http://www.iteye.com/topic/834528
弱弱的问一下,正文中的[1],怎么弄成上角标捏?
分享到:
相关推荐
powermock-easymock-junit-1.6.1.zip
powermock-easymock-junit-1.5.4.zip
easymock-2.5.2.jar easymock-2.5.2.jar 单元测试
easymock需要用到的包,没有它不行,easymock-3.1.jar
Junit+EasyMock单元测试使用资料以及案例分析,供学习单元测试的朋友学习使用!
手动的构造 Mock 对象会给开发人员带来额外的编码量,而且这些为创建 Mock 对象而编写的代码很有可能引入错误。目前,有许多开源项目对动态...通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。
几个例子展示如何使用EasyMock进行单元测试
EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest。
个人作品 4-EasyMock-Servlet.rar
还在为EasyMock使用时出异常而烦恼? 本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心...
NULL 博文链接:https://xuan0506.iteye.com/blog/1041296
easymock servlet 单元测试
EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
离线安装包,亲测可用
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。
java运行依赖jar包
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
离线安装包,亲测可用