MockMVC单元测试Controller
编写controller类
编写测试类ctrl+Shit +T 生成单元测试类
- @RunWith(SpringJUnit4ClassRunner.class)JUnit类运行器,会为JUnit测试加载Spring应用程序上下文,并为测试类自动织入所需的Bean。
- @SpringBootTest(classes = App.class)
- @ContextConfiguration(
classes=AddressBookConfiguration.class) n指定了如何加载应用程序上下文。此处我们让它加载AddressBookConfiguration里配置的Spring应用程序上下文
测试逻辑
-
- MockMVCBuilder构造MockMvc的构造器
- 使用mokMvc调用perform,执行RequestBuild请求,调用controller业务
- perform返回ResultActions,返回结果,通过ResultActions提供统一验证
- 使用StatusResultMatchers对请求结果进行验证
- ContentResultMatchers对请求内容进行验证
具体API
-
MockMvc的初始化需要在setUp中进行,MockMvcBuild用来构造MockMvc的构造器
-
实现类
- 1.StandaloneMockMvcBuilder
① MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc; 继承于后者 - DefaultMockMvcBuilder② MockMvcBuilders.standaloneSetup(Object… controllers):通过参数指定一组控制器,这样就不需要从上下文获取了,比如this.mockMvc = MockMvcBuilders.standaloneSetup(this.controller).build();
- 1.StandaloneMockMvcBuilder
-
-
MockMvcRequestBuilders 用于构建请求 其提供了一个方法buildRequest(ServletContext servletContext)用于构建MockHttpServletRequest;其主要有两个子类MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如文件上传使用),即用来Mock客户端请求需要的所有数据。
- MockHttpServletRequestBuilder get(String urlTemplate, Object… urlVariables):根据uri模板和uri变量值得到一个GET请求方式的RequestBuilder,如果在controller的方法中method选择的是RequestMethod.GET,那在controllerTest中对应就要使用MockMvcRequestBuilders.get。
- post(String urlTemplate, Object… urlVariables):同get类似,但是是POST方法;
put(String urlTemplate, Object… urlVariables):同get类似,但是是PUT方法;
delete(String urlTemplate, Object… urlVariables) :同get类似,但是是DELETE方法;
options(String urlTemplate, Object… urlVariables):同get类似,但是是OPTIONS方法;
-
ResultActions
-
调用MockMvc.perform(RequestBuilder requestBuilder)后将得到ResultActions,对ResultActions有以下三种处理:
-
- ResultActions.andExpect:添加执行完成后的断言。添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确;
-
- ResultActions.andDo:添加一个结果处理器,比如.andDo(MockMvcResultHandlers.print())输出整个响应结果信息,可以在调试的时候使用。
-
- ResultActions.andReturn:表示执行完成后返回相应的结果
-
备注:
ResultHandler用于对处理的结果进行相应处理的,比如输出整个请求/响应等信息方便调试,Spring mvc测试框架提供了MockMvcResultHandlers静态工厂方法,该工厂提供了ResultHandler print()返回一个输出MvcResult详细信息到控制台的ResultHandler实现
-
-
使用Content-type来指定不同格式的请求信息
//用contentType表示具体请求中的媒体类型信息,- Content-type(MediaType.APPLICATION_JSON) MediaType.APPLICATION_JSON表示互联网媒体类型的json数据格式(见备注)
-
ResultMatchers
- ResultMatcher用来匹配执行完请求后的结果验证,其就一个match(MvcResult result)断言方法,如果匹配失败将抛出相应的异常
-
MvcResult 即执行完控制器后得到的整个结果,并不仅仅是返回值,其包含了测试时需要的所有信息。
- MockHttpServletRequest getRequest():得到执行的请求;
- MockHttpServletResponse getResponse():得到执行后的响应;
- Object getHandler():得到执行的处理器,一般就是控制器;
- HandlerInterceptor[] getInterceptors():得到对处理器进行拦截的拦截器;
- ModelAndView getModelAndView():得到执行后的ModelAndView;
- Exception getResolvedException():得到HandlerExceptionResolver解析后的异常;
- FlashMap getFlashMap():得到FlashMap;
- Object getAsyncResult()/Object getAsyncResult(long timeout):得到异步执行的结果;
XMind: ZEN - Trial Version