Mock单元测试
导入需要的包
在pom.xml中添加
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope><exclusions><exclusion><artifactId>hamcrest-core</artifactId><groupId>org.hamcrest</groupId></exclusion></exclusions></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-all</artifactId><version>${hamcrest.version}</version><scope>test</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>${mockito.core.version}</version><scope>test</scope><exclusions><exclusion><artifactId>hamcrest-core</artifactId><groupId>org.hamcrest</groupId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version><scope>test</scope></dependency><!-包版本参数-!><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.version>4.0.0.RELEASE</spring.version><junit.version>4.11</junit.version><hamcrest.version>1.3</hamcrest.version><mockito.core.version>1.9.5</mockito.core.version></properties>
对于JSON请求和响应验证需要安装jackson Json和JsonPath依赖:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson2.version}</version></dependency><dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>${jsonpath.version}</version><scope>test</scope></dependency><properties><jsonpath.version>0.9.0</jsonpath.version><jackson2.version>2.2.3</jackson2.version></properties>
Spring mvc测试框架提供了测试MVC需要的API,主要包括有Servlet/JSP Mock,MockMvcBuilder,MockMvcRequestBuilder,ResultMatcher,ResultHandler,MvcResult。
可以静态导入方便测试:
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;
测试步骤如下:
- 准备测试环境
- 通过MockMvc执行请求
- 验证步骤
3.1. 添加验证断言
3.2. 添加结果处理器
3.3. 得到MvcResult进行自定义断言/进行下一步的异步请求 - 卸载测试环境
以下是一个测试的完整步骤。
//只显示了静态导入的部分import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;//配置环境@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration(value = "spring-mvc-test/src/main/webapp")@ContextHierarchy({@ContextConfiguration(locations = "classpath:spring-config.xml"),@ContextConfiguration(locations = "classpath:spring-mvc.xml")})public class ServerControllerTest {@Autowiredprivate WebApplicationContext wac;@Mockprivate MockMvc mockMvc;@Beforepublic void setUp() {//设置mock对象mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();}@Testpublic void test1() throws Exception {//测试普通控制器mockMvc.perform(get("/user/{id}", 1)) //执行请求.andExpect(model().attributeExists("user")) //验证存储模型数据.andExpect(model().attribute("user", hasProperty("name", equalTo("zhang")))) //验证存储模型数据.andExpect(view().name("user/view")) //验证viewName.andExpect(forwardedUrl("/WEB-INF/jsp/user/view.jsp"))//验证视图渲染时forward到的jsp.andExpect(status().isOk())//验证状态码.andDo(print()); //输出MvcResult到控制台}}
1.构建MockMvc对象
MockMvc对象由MockMvcBuilder来构造,有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
我们可以通过静态工厂MockMvcBuilders来创建。

对于传入了webApplicationContext的DefaultMockMvcBuilder提供了以下的API:

standaloneSetup(Object…)返回的StandaloneMockMvcBuilder由于不涉及到webApplicationContext,只是对Controller类的测试,所以还可以对其添加拦截器,映射器,验证器等。

2.执行请求
获得MockMvc对象后,通过mockMvc.perform方法来执行请求。
请求有以下几类,都是MockMvcRequestBuilders中的静态方法:
常用的有get,post,fileUpload。
返回的是MockMvcRequestBuilder对象,有设置param,cookie,header,accept等的方法
perform方法返回ResultActions对象
3.进行验证
mockMvc.perform返回的是 org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder对象,可以链式调用:
andExpect:添加ResultMatcher验证规则
andDo:添加ResultHandler结果处理器
andReturn:返回org.springframework.test.web.servlet.MvcResult对象,可以对其进行进一步的测试。
MvcResult有以下方法:

在andExpect中,需要传入ResultMatcher,通常由MockResultMatchers类来调用静态方法获取不同的测试分类静态工厂类。

比如执行.view()后返回ViewResultsMatchers静态工厂类,这个类主要有两个方法,
,然后由静态工厂类来生成ResultMatcher对象。
ResultMatcher只有一个接口,类似于函数接口。
public ResultMatcher name(final Matcher<? super String> matcher) {return new ResultMatcher() {@Overridepublic void match(MvcResult result) throws Exception {ModelAndView mav = result.getModelAndView();assertTrue("No ModelAndView found", mav != null);assertThat("View name", mav.getViewName(), matcher);}};}
浙公网安备 33010602011771号