servlet request和response的模拟单元测试
来源:互联网 发布:信用卡淘宝限额 编辑:程序博客网 时间:2024/05/02 02:14
项目采用分层开发,服务端和客户端。服务端的开发需要测试,但是涉及到了servletrequest和servletresponse。这里提供两种方法。
1、easymock
2、springmock
第一种方法
代码
- package com.zzrenfeng.util;
- import org.apache.commons.logging.*;
- import org.junit.*;
- import org.junit.runner.*;
- import org.springframework.mock.web.*;
- import org.springframework.test.context.*;
- import org.springframework.test.context.junit4.*;
- import org.springframework.test.context.support.*;
- import com.zzrenfeng.util.meetingapp.*;
- /**
- *
- * @ClassName: UserServiceTest
- * @Description: 单主键jdbcdao测试
- * @author renjunjie
- * @date 2010-12-10 下午03:20:08
- *
- */
- @RunWith(SpringJUnit4ClassRunner.class)
- @TestExecutionListeners( { DependencyInjectionTestExecutionListener.class })
- @ContextConfiguration(locations={ "classpath:resource/applicationContext-test.xml"})
- public class HttpServletTest {
- private static final Log log = LogFactory.getLog(HttpServletTest.class);
- private MockHttpServletRequest request;
- private MockHttpServletResponse response;
- @Before
- public void setUp(){
- request = new MockHttpServletRequest();
- request.setCharacterEncoding("UTF-8");
- response = new MockHttpServletResponse();
- }
- @Test
- public void test(){
- SecurityApplication sa = new SecurityApplication();
- //request.setRequestURI("/loginCheck.html");
- request.addParameter("userId", "9001"); //直接添加request参数,相当简单
- String result = sa.getPerson(request);
- System.out.println(result);
- }
- }
第二种方法
- package com.zzrenfeng.util;
- import javax.servlet.http.*;
- import org.apache.commons.logging.*;
- import org.easymock.*;
- import org.junit.*;
- import org.junit.runner.*;
- import org.springframework.test.context.*;
- import org.springframework.test.context.junit4.*;
- import org.springframework.test.context.support.*;
- import com.zzrenfeng.util.meetingapp.*;
- /**
- *
- * @ClassName: UserServiceTest
- * @Description: 单主键jdbcdao测试
- * @author renjunjie
- * @date 2010-12-10 下午03:20:08
- *
- */
- @RunWith(SpringJUnit4ClassRunner.class)
- @TestExecutionListeners( { DependencyInjectionTestExecutionListener.class })
- //@ContextConfiguration(locations={ "file:WebContent/WEB-INF/red5-web.xml"})
- @ContextConfiguration(locations={ "classpath:resource/applicationContext-test.xml"})
- public class HttpServletTest2 {
- private static final Log log = LogFactory.getLog(HttpServletTest2.class);
- private HttpServletRequest request;
- private HttpServletResponse response;
- @Before
- public void setUp(){
- //创建request和response的Mock
- request = (HttpServletRequest)EasyMock.createMock(HttpServletRequest.class);
- response = (HttpServletResponse) EasyMock.createMock(HttpServletResponse.class);
- }
- @Test
- public void test(){
- SecurityApplication sa = new SecurityApplication();
- EasyMock.expect(request.getParameter("opens")).andReturn("123").once(); //期望使用参数
- EasyMock.expect(request.getParameter("userId")).andReturn("9001").times(2); //期望调用的次数
- EasyMock.replay(request); //保存期望结果
- String result = sa.getPersonMeetings3G(request);
- System.out.println(result);
- }
- }
EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest。
EasyMock 可以mock interface和抽象java 类,但是不可以mock拥有被final修饰方法的类,不能mock静态方法(我遇到的情况是这样)。
在使用的时候请注意:
org.easymock.classextension.EasyMock 被用来mock抽象类(abstract)和具体类
org.easymock.EasyMock被用来mock接口(interface)
使用用EasyMock的一般步骤:
1.创建一个mock对象
HttpServletRequest request = EasyMock.createMock(HttpServletRequest.class);
2.设置此对象的某个方法的返回值
EasyMock.expect(request.getParameter("userName")).andReturn("trilogy").once();
注意:必须手工设置被mock的方法的访问次数
once()
antyTimes()
times(int)
建议:在设置方法调用次数的时候,虽然你可以调用anyTimes(),但是最好明确你要调用多少次如:once()、
times(2),这样做的话显的比较严谨。
如果mock的方法没有返回值,可以这么做:
request.setAttribute("userId");
EasyMock.expectLastCall().once();
对于被mock的方法参数,也可以不必指定具体的值:
EasyMock.expect(request.getParameter((String)EasyMock.anyObject())).andReturn("trilogy").once();
如果你想让被mock的方法返回一个异常,前提是被mock的方法会抛出异常,你可以这么做:
EasyMock.expect(input.read()).andThrow(new IOException("Mocked IOException")).once();
你还可以根据调用顺序来mock同一个方法:
EasyMock.expect(request.getParameter("userName")).andReturn("trilogy").once();
EasyMock.expect(request.getParameter("userName")).andReturn(null).once();
当第一次执行request.getParameter("userName")的时候,返回“trilogy”
当第二次执行request.getParameter("userName")的时候,返回null
3.保存被mock的对象
EasyMock.replay(a);
4.在被mock的对象被应用之后,最好验证一下我们所设置的mock对象是不是按我们预期运行。
EasyMock.verify(a);
总结:
EasyMock是一个相当方便的mock工具,可以为我们的测试工作提供极大的便利,特别是在测试web层或者数据库访问的时候。
在这里我只是抛砖引玉地介绍了一下EasyMock的使用,其实EasyMock还有很多其它更高级的使用,如过你愿意的话可以访问以下的网址来获得更多信息:
官网:www.easymock.org
- servlet request和response的模拟单元测试
- Servlet:response和request
- HttpServletRequest和response的模拟单元测试
- Servlet---Request和Response的用法演示
- 8 servlet的入门request和response
- servlet中的request和response
- Servlet获取Request和Response
- Servlet中的Response和Request
- Servlet中的Request和Response
- Servlet中的Request和Response的请求和响应概述
- servlet之request和response的使用区分
- struts2 中使用servlet的输出流和request,response
- servlet中response和request的字符编码问题
- servlet如何选择request.getRequestDispatcher和response.sendRedirect的使用
- servlet之response和request对象的引用
- Servlet中两大对象request和response的编码问题总结
- Servlet中Request和Response 详解
- servlet处理request和response中文乱码
- 修改控制台大小
- 面向构件的开发:SCA还是SOA?
- hightcharts 一个例子先记一下
- Linux 静态库的创建和使用
- td 换行 div滚动条 获取select的选项值
- servlet request和response的模拟单元测试
- python下mysql数据库处理输入字符串
- ios中类变量的作用范围
- objective-c中import与@class的说明
- Xcode The Simulator can't be launched because it is already in use .
- poj-2260
- Android学习之路之ListView的使用
- ubuntu 12.04 安装搜狗输入法
- ios frame与bounds的区别比较