您的位置:首页 > 编程语言 > Java开发

Spring MVC测试框架

2016-08-19 14:01 330 查看
测试步骤:

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 {
@Autowired
protected WebApplicationContext wac;

protected MockMvc mockMvc;

@Before
public void init()
{
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}

@Test
public 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring MVC 测试框架