`
tify
  • 浏览: 14629 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

servlet request和response的模拟单元测试

 
阅读更多

项目采用分层开发,服务端和客户端。服务端的开发需要测试,但是涉及到了servletrequest和servletresponse。这里提供两种方法。

1、easymock

2、springmock

第一种方法

代码

Java代码收藏代码
  1. packagecom.zzrenfeng.util;
  2. importorg.apache.commons.logging.*;
  3. importorg.junit.*;
  4. importorg.junit.runner.*;
  5. importorg.springframework.mock.web.*;
  6. importorg.springframework.test.context.*;
  7. importorg.springframework.test.context.junit4.*;
  8. importorg.springframework.test.context.support.*;
  9. importcom.zzrenfeng.util.meetingapp.*;
  10. /**
  11. *
  12. *@ClassName:UserServiceTest
  13. *@Description:单主键jdbcdao测试
  14. *@authorrenjunjie
  15. *@date2010-12-10下午03:20:08
  16. *
  17. */
  18. @RunWith(SpringJUnit4ClassRunner.class)
  19. @TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
  20. @ContextConfiguration(locations={"classpath:resource/applicationContext-test.xml"})
  21. publicclassHttpServletTest{
  22. privatestaticfinalLoglog=LogFactory.getLog(HttpServletTest.class);
  23. privateMockHttpServletRequestrequest;
  24. privateMockHttpServletResponseresponse;
  25. @Before
  26. publicvoidsetUp(){
  27. request=newMockHttpServletRequest();
  28. request.setCharacterEncoding("UTF-8");
  29. response=newMockHttpServletResponse();
  30. }
  31. @Test
  32. publicvoidtest(){
  33. SecurityApplicationsa=newSecurityApplication();
  34. //request.setRequestURI("/loginCheck.html");
  35. request.addParameter("userId","9001");//直接添加request参数,相当简单
  36. Stringresult=sa.getPerson(request);
  37. System.out.println(result);
  38. }
  39. }

第二种方法

Java代码收藏代码
  1. packagecom.zzrenfeng.util;
  2. importjavax.servlet.http.*;
  3. importorg.apache.commons.logging.*;
  4. importorg.easymock.*;
  5. importorg.junit.*;
  6. importorg.junit.runner.*;
  7. importorg.springframework.test.context.*;
  8. importorg.springframework.test.context.junit4.*;
  9. importorg.springframework.test.context.support.*;
  10. importcom.zzrenfeng.util.meetingapp.*;
  11. /**
  12. *
  13. *@ClassName:UserServiceTest
  14. *@Description:单主键jdbcdao测试
  15. *@authorrenjunjie
  16. *@date2010-12-10下午03:20:08
  17. *
  18. */
  19. @RunWith(SpringJUnit4ClassRunner.class)
  20. @TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
  21. //@ContextConfiguration(locations={"file:WebContent/WEB-INF/red5-web.xml"})
  22. @ContextConfiguration(locations={"classpath:resource/applicationContext-test.xml"})
  23. publicclassHttpServletTest2{
  24. privatestaticfinalLoglog=LogFactory.getLog(HttpServletTest2.class);
  25. privateHttpServletRequestrequest;
  26. privateHttpServletResponseresponse;
  27. @Before
  28. publicvoidsetUp(){
  29. //创建request和response的Mock
  30. request=(HttpServletRequest)EasyMock.createMock(HttpServletRequest.class);
  31. response=(HttpServletResponse)EasyMock.createMock(HttpServletResponse.class);
  32. }
  33. @Test
  34. publicvoidtest(){
  35. SecurityApplicationsa=newSecurityApplication();
  36. EasyMock.expect(request.getParameter("opens")).andReturn("123").once();//期望使用参数
  37. EasyMock.expect(request.getParameter("userId")).andReturn("9001").times(2);//期望调用的次数
  38. EasyMock.replay(request);//保存期望结果
  39. Stringresult=sa.getPersonMeetings3G(request);
  40. System.out.println(result);
  41. }
  42. }

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics