利用Spring的mock进行单元测试

   与测试独立的Java对象相比,测试J2EE Web组件是一项更困难的任务,因为Web组件必须运行在Web容器里,并且必须与HTTP请求交互才有意义。mock对象是一个术语,主要流行于eXtreme程序员和JUnit小组中。在单元测试中,mock对象以简单方式模仿某个组件的行为和结果,从而保证单元测试专注于组件本身,而不用担心其他依赖性问题。

1.      Springmock

Spring框架提供大量测试用的mock类,包括JNDI相关的mock类,Spring portlet相关的mock类,以及Web应用相关的mock类。尤其是Web应用相关的mock类,可以大大提高Web组件测试的便捷性。以下是Spring所提供的Web应用相关的mock类。

²       org.springframework.mock.web.MockHttpServletRequest HttpServletRequest接口的mock实现,用于模拟客户端的HTTP请求。这是最重要、最常用的mock类。

²       org.springframework.mock.web.MockHttpServletResponseHttpServletResponse接口的mock实现,用于模拟服务器端对客户端的响应。

²       org.springframework.mock.web.MockHttpSessionHttpSession接口的mock实现,这是一个经常使用的mock类。

²       org.springframework.mock.web.DelegatingServletInputStreamServletInputStream接口的mock实现。

²       org.springframework.mock.web.DelegatingServletOutputStreamServletOutputStream接口的mock实现,如果需要拦截和分析服务器的输出流内容,可以使用该类。

²       org.springframework.mock.web.MockFilterConfigFilterConfig接口的mock实现。

²       org.springframework.mock.web.MockPageContextJSP  PageContext接口的mock实现,通过该类可以测试预编译的JSP

²       org.springframework.mock.web.MockRequestDispatcherRequestDispatcher接口的一个mock实现。

²       org.springframework.mock.web.MockServletConfigServletConfig接口的一个mock实现。

测试用例中,可以简单的创建这些mock对象来模拟目的对象。例如HttpServletRequest是一个保存HTTP参数的组件,而这些参数可用于驱动其他Web组件。MockHttpServletRequest可以直接创建HttpServletRequest接口的实例,并设置其中的参数。在典型的Web组件测试下,可以采用如下方式设置其中的任何参数:

    //指定表单方法和请求的URL

MockHttpServletRequest request = new MockHttpServletRequest("POST","/login.do");

    //向请求中增加参数

    request.addParameter("user","username");

request.addParameter("pass","password");

类似的地,也可以在测试用例中创建HttpServletResponseHttpSession对象,并设置它们的相关属性。

2.      利用mock类测试控制器

下面是利用mock对象完成控制器测试的源代码:详见mockTest

// 该控制器是MultiActionController控制器的delegate

public class SampleDelegate

{

    // welcome方法

    public ModelAndView welcome( HttpServletRequest req, HttpServletResponse resp)

    {

       System.out.println("==========" + req.getParameter("method"));

        return new ModelAndView("/WEB-INF/jsp/welcome.jsp", "model", new Long(System.currentTimeMillis()));

    }

    // hello方法

    public ModelAndView hello( HttpServletRequest req, HttpServletResponse resp)

    {

        return new ModelAndView("/WEB-INF/jsp/hello.jsp", "model", "欢迎学习Spring");

    }

}

下面是关于此控制器的配置文件。配置文件里配置了MultiActionController,同时配置了该控制器的delegate。配置文件如下:

 

<?xml version="1.0" encoding="gb2312"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

 

<beans>

    <!--

    ParameterMethodNameResolver 解析请求参数,并将它作为方法名(http://www.sf.net/index.view?testParam=testIt的请求就会调用    testIt(HttpServletRequest,HttpServletResponse))。使用paramName配置参数可以调整所检查的参数

 

    InternalPathMethodNameResolver 从路径中获取文件名作为方法名(http://www.sf.net/testing.view的请求会调用testing(HttpServletRequest, HttpServletResponse)方法)

 

    PropertiesMethodNameResolver 使用用户定义的属性对象将请求的URL映射到方法名。当属性定义/index/welcome.html=doIt

   

    并且收到/index/welcome.html的请求,就调用doIt

    -->

   

    <!--  配置根据请求名决定控制器-->

    <bean id="handlerMapping"

          class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

 

    <!-- 配置MultiActionController 控制器所需要的参数解析器 -->

    <bean id="paramResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">

       <!-- 确定根据method来决定处理器定向 -->

       <property name="paramName">

           <value>method</value>

       </property>

Classes contained in spring-mock.jar: org.springframework.mock.jndi.ExpectedLookupTemplate.class org.springframework.mock.jndi.SimpleNamingContext.class org.springframework.mock.jndi.SimpleNamingContextBuilder.class org.springframework.mock.web.DelegatingServletInputStream.class org.springframework.mock.web.DelegatingServletOutputStream.class org.springframework.mock.web.HeaderValueHolder.class org.springframework.mock.web.MockExpressionEvaluator.class org.springframework.mock.web.MockFilterChain.class org.springframework.mock.web.MockFilterConfig.class org.springframework.mock.web.MockHttpServletRequest.class org.springframework.mock.web.MockHttpServletResponse.class org.springframework.mock.web.MockHttpSession.class org.springframework.mock.web.MockMultipartFile.class org.springframework.mock.web.MockMultipartHttpServletRequest.class org.springframework.mock.web.MockPageContext.class org.springframework.mock.web.MockRequestDispatcher.class org.springframework.mock.web.MockServletConfig.class org.springframework.mock.web.MockServletContext.class org.springframework.mock.web.PassThroughFilterChain.class org.springframework.mock.web.portlet.MockActionRequest.class org.springframework.mock.web.portlet.MockActionResponse.class org.springframework.mock.web.portlet.MockMultipartActionRequest.class org.springframework.mock.web.portlet.MockPortalContext.class org.springframework.mock.web.portlet.MockPortletConfig.class org.springframework.mock.web.portlet.MockPortletContext.class org.springframework.mock.web.portlet.MockPortletPreferences.class org.springframework.mock.web.portlet.MockPortletRequest.class org.springframework.mock.web.portlet.MockPortletRequestDispatcher.class org.springframework.mock.web.portlet.MockPortletResponse.class org.springframework.mock.web.portlet.MockPortletSession.class org.springframework.mock.web.portlet.MockPortletURL.class org.springframework.mock.web.portlet.MockRenderRequest.class org.springframework.mock.web.portlet.MockRenderResponse.class org.springframework.test.AbstractDependencyInjectionSpringContextTests.class org.springframework.test.AbstractSingleSpringContextTests.class org.springframework.test.AbstractSpringContextTests.class org.springframework.test.AbstractTransactionalDataSourceSpringContextTests.class org.springframework.test.AbstractTransactionalSpringContextTests.class org.springframework.test.AssertThrows.class org.springframework.test.ConditionalTestCase.class org.springframework.test.annotation.AbstractAnnotationAwareTransactionalTests.class org.springframework.test.annotation.DirtiesContext.class org.springframework.test.annotation.ExpectedException.class org.springframework.test.annotation.IfProfileValue.class org.springframework.test.annotation.NotTransactional.class org.springframework.test.annotation.ProfileValueSource.class org.springframework.test.annotation.Repeat.class org.springframework.test.annotation.SystemProfileValueSource.class org.springframework.test.annotation.Timed.class org.springframework.test.jpa.AbstractAspectjJpaTests.class org.springframework.test.jpa.AbstractJpaTests.class org.springframework.test.jpa.OrmXmlOverridingShadowingClassLoader.class org.springframework.test.web.AbstractModelAndViewTests.class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值