Spring MVC测试框架

来源:互联网 发布:玫瑰花 简笔画软件 编辑:程序博客网 时间:2024/06/05 06:46

测试步骤:

1、准备测试环境

2、通过MockMvcBuilders获取MockMvc对象

3、通过MockMvc执行请求,获取ResultActions对象

4、通过ResultAciotns添加MockMvcResultMathers断言,添加MockMvcResultHandlers结果处理器

5、得到处理结果MvcResult对象,进行自定义断言或进行下一步异步请求


一、准备测试环境

package Test;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.ContextHierarchy;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.web.WebAppConfiguration;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.ResultActions;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.test.web.servlet.result.MockMvcResultMatchers;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.web.context.WebApplicationContext;@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration@ContextHierarchy({      @ContextConfiguration(name = "parent", locations = "classpath:spring-config.xml"),      @ContextConfiguration(name = "child", locations = "classpath:spring-mvc.xml")  })public class BaseTest { }

@RunWith: 指定使用junit4进行测试

@WebAppConfiguration:测试环境使用,用来表示测试环境使用的ApplicationContext是WebApplicationContext类型的;value指定web应用的根

@ContextHierarchy:指定容器层次。本例中:spring-config.xml是父容器,spring-mvc.xml为子容器

@ContextConfiguration:加载配置文件

二、相关对象解析

public class BaseTest { @Autowiredprotected WebApplicationContext wac;protected MockMvc mockMvc;@Beforepublic void init(){mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();}@Testpublic void testShow() throws Exception{//通过MockMvcRequestBuilders构建post请求,并执行ResultActions result = mockMvc.perform(MockMvcRequestBuilders.post("/dj/show"))//添加MockMvcResultMatchers断言,判断响应状态.andExpect(MockMvcResultMatchers.status().isOk())//添加结果处理器,输出MvcResult详细信息到控制台.andDo(MockMvcResultHandlers.print());//自定义断言Assert.assertEquals(result.andReturn().getResponse().getContentAsString(),"this is my show");}}

MockBuilders

MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockBuilder.

MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将从该上下文获取相应的控制器并得到相应的MockMvc。

MockMvcBuilders.standaloneSetup(Object... controllers):通过参数指定一组控制器,这样就不需要从上下文获取了


MockMvc

perform:执行一个RequestBuilder请求,会自动执行Spring Mvc的流程并映射到相应的控制器执行处理


MockMvcRequestBuilders

用来构建请求,

主要有两个子类:MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如:文件上传使用),用来Mock客户端请求所需的所有数据。


MockMvcRequestBuilders主要方法:

MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的MockHttpServletRequestBuilder;如get("/user/{id}", 1L);
MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables):同get类似,但是是POST方法;


MockHttpServletRequestBuilder主要方法:

MockHttpServletRequestBuilder header(String name, Object... values)/MockHttpServletRequestBuilder headers(HttpHeaders httpHeaders):添加头信息;
MockHttpServletRequestBuilder contentType(MediaType mediaType):指定请求的contentType头信息;
MockHttpServletRequestBuilder accept(MediaType... mediaTypes)/MockHttpServletRequestBuilder accept(String... mediaTypes):指定请求的Accept头信息;
MockHttpServletRequestBuilder content(byte[] content)/MockHttpServletRequestBuilder content(String content):指定请求Body体内容;


MockMultipartHttpServletRequestBuilder继承自MockHttpServletRequestBuilder,主要方法:

MockMultipartHttpServletRequestBuilder file(String name, byte[] content)/MockMultipartHttpServletRequestBuilder file(MockMultipartFile file):指定要上传的文件;


ResultActions:

调用MockMvc.perform(RequestBuilder requestBuilder)后将得到ResultAction

ResultActions andExpect(ResultMatcher matcher) :添加验证断言来判断执行请求后的结果是否是预期的

ResultActions andDo(ResultHandler handler) :添加结果处理器,用于对验证成功后执行的动作。如:输出请求/结果信息

MvcResult andReturn() :返回验证成功后的MvcResult,用于自定义验证/下一步的异步处理


MockMvcResultMathers

用来匹配执行完请求后的结果验证。主要方法:

StatusResultMatchers status():得到响应状态验证器;
HeaderResultMatchers header():得到响应Header验证器;
CookieResultMatchers cookie():得到响应Cookie验证器;
ContentResultMatchers content():得到响应内容验证器;


MockMvcResultHandlers

用于对处理结果进行相应处理。如:输出整个请求/响应。Spring Mvc测试框架提供了MockMvcResultHandlers静态工厂方法,该工厂提供了:

ResultHandler print():返回一个输出MvcResult详细信息到控制台的ResultHandler实现。


MvcResult

即执行完控制器后得到的整个结果,并不仅仅是返回值,包含了测试时需要的所有信息,如:

MockHttpServletRequest getRequest():得到执行的请求;
MockHttpServletResponse getResponse():得到执行后的响应;
Object getHandler():得到执行的处理器,一般就是控制器;
HandlerInterceptor[] getInterceptors():得到对处理器进行拦截的拦截器;
ModelAndView getModelAndView():得到执行后的ModelAndView;
Exception getResolvedException():得到HandlerExceptionResolver解析后的异常;
FlashMap getFlashMap():得到FlashMap;
Object getAsyncResult()/Object getAsyncResult(long timeout):得到异步执行的结果;


参考文章:http://jinnianshilongnian.iteye.com/blog/2004660






0 0