springmockMVC 测试controller

8 篇文章 1 订阅
3 篇文章 0 订阅

springmockMVC测试WEB Controller

1.应用场景:

    SSM框架大行天下的时候,伴随着测试驱动开发模式的盛行,springmvc 测试也是每个开发人员必须面对的问题。springMVC框架中有两种配置方式,一种是将主要的配置,例如数据层,服务层,和事务层放置在一个common.xml中,然后将mvc相关的配置放置在mvc的配置文件中,mvc_servlet.xml中。这种方式适用于大型项目的开发,易于扩展和维护;另外一种就是大家经常见到的只有一个springmvc.xml的配置,加载所有的bean和配置。优点是简单明了。

  2.测试方式

    因为是web层的测试,spring提供了spring-test的模块给大家使用,其中有关于web层有mockmvc的测试相关内容。

   第一种配置方式的测试:

    web.xml中的书写如图:


   

    


此种配置方式没有使用junit4与spring-test结合的方式,也就是大家经常用的 @RunWith(SpringJUnit4ClassRunner.class)  

@ContextConfiguration({"spring-context.xml"}) //加载配置文件。原因:

原因1.此处我需要使用的是MockMvcBuilders.webAppContextSetup(context).build()来初始化mockmvc,进而去执行测试的controller方法。

原因2.使用@ContextConfiguration加载不在classpath下的配置文件时总是会报文件找不到的问题,因为我们的mvc配置在WEB-INF下。

第二种配置方式的测试

 web.xml中的书写如图:


测试类

@RunWith(SpringJUnit4ClassRunner.class)  //使用junit4进行测试
@ContextConfiguration({"/config/springmvc-servlet.xml"}) //加载配置文件

public class MockMvcControllerTest {

private MockMvc mvc ;
@Test
public  void test() {


/*XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocations("file:src/sources/config/spring_common.xml",
"file:src/webapp/WEB-INF/springmvc-servlet.xml");
MockServletContext msc = new MockServletContext();
context.setServletContext(msc);
context.refresh();
msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);*/
/*mvc = MockMvcBuilders.webAppContextSetup(context).build();*/

mvc = MockMvcBuilders.standaloneSetup(new MyController()).build();
try {
Map<String , String> result = new HashMap<>();
result.put("flag", "success");
result.put("data", "hello");
String expected = JSON.toJSONString(result);
MvcResult mvcResult = mvc.perform(get("/test/hi.do"))
.andExpect(status().isOk())
// .andExpect(content().json(expected))
.andReturn();
System.out.println(mvcResult.getResponse().getContentAsString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

说明:MockMvcBuilders.standaloneSetup(new MyController()),中可以是多个controller。源码如下:

       public static StandaloneMockMvcBuilder standaloneSetup(Object... controllers) {
return new StandaloneMockMvcBuilder(controllers);
}

这种方式相比较于第一种简单很多,当然你也可以采用第一种方式,将配置文件配置进来,但是相对麻烦很多。

3.第一种测试配置方式的分析:

MockMvcBuilders.webAppContextSetup(context),源码如下


大意是使用给定的完全初始化的(例如执行过refreshed)的WebApplicationContext,spring的前端控制器将会使用这个上下文去发现spring mvc 框架和其中应用的控制层,这个上下文必须已经配置了一个servletcontext。

然后找下WebApplicationContext的层级图,如下


发现XmlWebApplicationContext比较适合我们使用,然后结合类说明去创建就行。


接着我们看下servletcontext的层级图:



以上说明就有了如下代码:

XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocations("file:src/sources/config/spring_common.xml",
"file:src/webapp/WEB-INF/springmvc-servlet.xml");
MockServletContext msc = new MockServletContext();
context.setServletContext(msc);
context.refresh();
msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);


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、付费专栏及课程。

余额充值