目录

HttpServletRequest和response的模拟单元测试

目录

HttpServletRequest和response的模拟单元测试

from:http://blueram.iteye.com/blog/1615700

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

1、easymock

2、springmock

第一种方法

代码

Java代码 https://i-blog.csdnimg.cn/blog_migrate/9d529c7ea000060144ae6251333c19a7.png

  1. package com.zzrenfeng.util;

  2. import org.apache.commons.logging.*;

  3. import org.junit.*;

  4. import org.junit.runner.*;

  5. import org.springframework.mock.web.*;

  6. import org.springframework.test.context.*;

  7. import org.springframework.test.context.junit4.*;

  8. import org.springframework.test.context.support.*;

  9. import com.zzrenfeng.util.meetingapp.*;

  10. /**

  11. * @ClassName: UserServiceTest

  12. * @Description: 单主键jdbcdao测试

  13. * @author renjunjie

  14. * @date 2010-12-10 下午03:20:08

  15. */

  16. @RunWith (SpringJUnit4ClassRunner. class )

  17. @TestExecutionListeners ( { DependencyInjectionTestExecutionListener. class })

  18. @ContextConfiguration (locations={ “classpath:resource/applicationContext-test.xml” })

  19. public

    class HttpServletTest  {

  20. private

    static

    final Log log = LogFactory.getLog(HttpServletTest. class );

  21. private MockHttpServletRequest request;

  22. private MockHttpServletResponse response;

  23. @Before

  24. public

    void setUp(){

  25. request = new MockHttpServletRequest();

  26. request.setCharacterEncoding( “UTF-8” );

  27. response = new MockHttpServletResponse();

  28. }

  29. @Test

  30. public

    void test(){

  31. SecurityApplication sa = new SecurityApplication();

  32. //request.setRequestURI("/loginCheck.html");

  33. request.addParameter( “userId” , “9001” ); //直接添加request参数,相当简单

  34. String result = sa.getPerson(request);

  35. System.out.println(result);

  36. }

  37. }

第二种方法

Java代码 https://i-blog.csdnimg.cn/blog_migrate/9d529c7ea000060144ae6251333c19a7.png

  1. package com.zzrenfeng.util;

  2. import javax.servlet.http.*;

  3. import org.apache.commons.logging.*;

  4. import org.easymock.*;

  5. import org.junit.*;

  6. import org.junit.runner.*;

  7. import org.springframework.test.context.*;

  8. import org.springframework.test.context.junit4.*;

  9. import org.springframework.test.context.support.*;

  10. import com.zzrenfeng.util.meetingapp.*;

  11. /**

  12. * @ClassName: UserServiceTest

  13. * @Description: 单主键jdbcdao测试

  14. * @author renjunjie

  15. * @date 2010-12-10 下午03:20:08

  16. */

  17. @RunWith (SpringJUnit4ClassRunner. class )

  18. @TestExecutionListeners ( { DependencyInjectionTestExecutionListener. class })

  19. //@ContextConfiguration(locations={ “file:WebContent/WEB-INF/red5-web.xml”})

  20. @ContextConfiguration (locations={ “classpath:resource/applicationContext-test.xml” })

  21. public

    class HttpServletTest2  {

  22. private

    static

    final Log log = LogFactory.getLog(HttpServletTest2. class );

  23. private HttpServletRequest request;

  24. private HttpServletResponse response;

  25. @Before

  26. public

    void setUp(){

  27. //创建request和response的Mock

  28. request = (HttpServletRequest)EasyMock.createMock(HttpServletRequest. class );

  29. response = (HttpServletResponse) EasyMock.createMock(HttpServletResponse. class );

  30. }

  31. @Test

  32. public

    void test(){

  33. SecurityApplication sa = new SecurityApplication();

  34. EasyMock.expect(request.getParameter( “opens” )).andReturn( “123” ).once(); //期望使用参数

  35. EasyMock.expect(request.getParameter( “userId” )).andReturn( “9001” ).times( 2 ); //期望调用的次数

  36. EasyMock.replay(request); //保存期望结果

  37. String result = sa.getPersonMeetings3G(request);

  38. System.out.println(result);

  39. }

  40. }

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