青海西宁网站开发公司,wordpress 重复标题,长沙经开区建设局网站,网站开发谷歌浏览器js不更新SpringMVC测试框架 基于RESTful风格的SpringMVC的测试#xff0c;我们可以测试完整的Spring MVC流程#xff0c;即从URL请求到控制器处理#xff0c;再到视图渲染都可以测试。 一 MockMvcBuilder MockMvcBuilder是用来构造MockMvc的构造器#xff0c;其主要有两个实现… SpringMVC测试框架 基于RESTful风格的SpringMVC的测试我们可以测试完整的Spring MVC流程即从URL请求到控制器处理再到视图渲染都可以测试。 一 MockMvcBuilder MockMvcBuilder是用来构造MockMvc的构造器其主要有两个实现StandaloneMockMvcBuilder和DefaultMockMvcBuilder分别对应两种测试方式即独立安装和集成Web环境测试此种方式并不会集成真正的web环境而是通过相应的Mock API进行模拟测试无须启动服务器。对于我们来说直接使用静态工厂MockMvcBuilders创建即可。 1.集成Web环境方式 MockMvcBuilders.webAppContextSetup(WebApplicationContext context)指定WebApplicationContext将会从该上下文获取相应的控制器并得到相应的MockMvc RunWith(SpringJUnit4ClassRunner.class)
ContextConfiguration(classpath:config/IncotermsRestServiceTest-context.xml)
WebAppConfiguration
public class IncotermsRestServiceTest {Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;Beforepublic void setup() {this.mockMvc MockMvcBuilders.webAppContextSetup(this.wac).build(); //构造MockMvc}...
} 注意(1)WebAppConfiguration测试环境使用用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的value指定web应用的根(2)通过Autowired WebApplicationContext wac注入web环境的ApplicationContext容器(3)然后通过MockMvcBuilders.webAppContextSetup(wac).build()创建一个MockMvc进行测试 2.独立测试方式 MockMvcBuilders.standaloneSetup(Object... controllers)通过参数指定一组控制器这样就不需要从上下文获取了 public class PricingExportResultsRestServiceTest {InjectMocksprivate PricingExportResultsRestService pricingExportResultsRestService;Mockprivate ExportRateScheduleService exportRateScheduleService;Mockprivate PricingUrlProvider pricingUrlProvider;private MockMvc mockMvc;Beforepublic void setup() {MockitoAnnotations.initMocks(this);mockMvc MockMvcBuilders.standaloneSetup(pricingExportResultsRestService).build(); //构造MockMvc}...
} 主要是两个步骤(1)首先自己创建相应的控制器注入相应的依赖(2)通过MockMvcBuilders.standaloneSetup模拟一个Mvc测试环境通过build得到一个MockMvc 二 MockMvc 先看一个测试例子1 Testpublic void createIncotermSuccess() throws Exception {IncotermTo createdIncoterm new IncotermTo();createdIncoterm.setId(new IncotermId(UUID.fromString(6305ff33-295e-11e5-ae37-54ee7534021a)));createdIncoterm.setCode(EXW);createdIncoterm.setDescription(code exw);createdIncoterm.setLocationQualifier(LocationQualifier.DEPARTURE);when(inventoryService.create(any(IncotermTo.class))).thenReturn(createdIncoterm);mockMvc.perform(post(/secured/resources/incoterms/create).accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON).content({\code\ : \EXW\, \description\ : \code exw\, \locationQualifier\ : \DEPARTURE\}.getBytes()))//.andDo(print()).andExpect(status().isOk()).andExpect(jsonPath(id.value).exists()).andExpect(jsonPath(id.value).value(6305ff33-295e-11e5-ae37-54ee7534021a)).andExpect(jsonPath(code).value(EXW));} perform执行一个RequestBuilder请求会自动执行SpringMVC的流程并映射到相应的控制器执行处理andExpect添加ResultMatcher验证规则验证控制器执行完成后结果是否正确andDo添加ResultHandler结果处理器比如调试时打印结果到控制台andReturn最后返回相应的MvcResult然后进行自定义验证/进行下一步的异步处理 看一个具体的例子2 Test public void testView() throws Exception { MvcResult result mockMvc.perform(MockMvcRequestBuilders.get(/user/1)) .andExpect(MockMvcResultMatchers.view().name(user/view)) .andExpect(MockMvcResultMatchers.model().attributeExists(user)) .andDo(MockMvcResultHandlers.print()) .andReturn(); Assert.assertNotNull(result.getModelAndView().getModel().get(user)); } 整个过程1、mockMvc.perform执行一个请求2、MockMvcRequestBuilders.get(/user/1)构造一个请求3、ResultActions.andExpect添加执行完成后的断言4、ResultActions.andDo添加一个结果处理器表示要对结果做点什么事情比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。5、ResultActions.andReturn表示执行完成后返回相应的结果。 整个测试过程非常有规律1、准备测试环境2、通过MockMvc执行请求3.1、添加验证断言3.2、添加结果处理器3.3、得到MvcResult进行自定义断言/进行下一步的异步请求4、卸载测试环境 三 RequestBuilder/MockMvcRequestBuilders 从名字可以看出RequestBuilder用来构建请求的其提供了一个方法buildRequest(ServletContext servletContext)用于构建MockHttpServletRequest其主要有两个子类MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder如文件上传使用即用来Mock客户端请求需要的所有数据。 1.MockMvcRequestBuilders主要API MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables)根据uri模板和uri变量值得到一个GET请求方式的MockHttpServletRequestBuilder如get(/user/{id}, 1L)MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables)同get类似但是是POST方法MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables)同get类似但是是PUT方法MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) 同get类似但是是DELETE方法MockHttpServletRequestBuilder options(String urlTemplate, Object... urlVariables)同get类似但是是OPTIONS方法MockHttpServletRequestBuilder request(HttpMethod httpMethod, String urlTemplate, Object... urlVariables) 提供自己的Http请求方法及uri模板和uri变量如上API都是委托给这个APIMockMultipartHttpServletRequestBuilder fileUpload(String urlTemplate, Object... urlVariables)提供文件上传方式的请求得到MockMultipartHttpServletRequestBuilderRequestBuilder asyncDispatch(final MvcResult mvcResult)创建一个从启动异步处理的请求的MvcResult进行异步分派的RequestBuilder 2.MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder API (1)MockHttpServletRequestBuilder API 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体内容MockHttpServletRequestBuilder cookie(Cookie... cookies)指定请求的CookieMockHttpServletRequestBuilder locale(Locale locale)指定请求的LocaleMockHttpServletRequestBuilder characterEncoding(String encoding)指定请求字符编码MockHttpServletRequestBuilder requestAttr(String name, Object value) 设置请求属性数据MockHttpServletRequestBuilder sessionAttr(String name, Object value)/MockHttpServletRequestBuilder sessionAttrs(Mapstring, object sessionAttributes)设置请求session属性数据MockHttpServletRequestBuilder flashAttr(String name, Object value)/MockHttpServletRequestBuilder flashAttrs(Mapstring, object flashAttributes)指定请求的flash信息比如重定向后的属性信息MockHttpServletRequestBuilder session(MockHttpSession session) 指定请求的SessionMockHttpServletRequestBuilder principal(Principal principal) 指定请求的PrincipalMockHttpServletRequestBuilder contextPath(String contextPath) 指定请求的上下文路径必须以“/”开头且不能以“/”结尾MockHttpServletRequestBuilder pathInfo(String pathInfo) 请求的路径信息必须以“/”开头MockHttpServletRequestBuilder secure(boolean secure)请求是否使用安全通道MockHttpServletRequestBuilder with(RequestPostProcessor postProcessor)请求的后处理器用于自定义一些请求处理的扩展点 (2)MockMultipartHttpServletRequestBuilder继承自MockHttpServletRequestBuilder又提供了如下API MockMultipartHttpServletRequestBuilder file(String name, byte[] content)/MockMultipartHttpServletRequestBuilder file(MockMultipartFile file)指定要上传的文件 四 ResultActions 调用MockMvc.perform(RequestBuilder requestBuilder)后将得到ResultActions通过ResultActions完成如下三件事ResultActions andExpect(ResultMatcher matcher) 添加验证断言来判断执行请求后的结果是否是预期的ResultActions andDo(ResultHandler handler) 添加结果处理器用于对验证成功后执行的动作如输出下请求/结果信息用于调试MvcResult andReturn() 返回验证成功后的MvcResult用于自定义验证/下一步的异步处理 五 ResultMatcher/MockMvcResultMatchers 1.ResultMatcher用来匹配执行完请求后的结果验证其就一个match(MvcResult result)断言方法如果匹配失败将抛出相应的异常spring mvc测试框架提供了很多***ResultMatchers来满足测试需求。注意这些***ResultMatchers并不是ResultMatcher的子类而是返回ResultMatcher实例的。Spring mvc测试框架为了测试方便提供了MockMvcResultMatchers静态工厂方法方便操作 2.具体的API如下HandlerResultMatchers handler()请求的Handler验证器比如验证处理器类型/方法名此处的Handler其实就是处理请求的控制器RequestResultMatchers request()得到RequestResultMatchers验证器ModelResultMatchers model()得到模型验证器ViewResultMatchers view()得到视图验证器FlashAttributeResultMatchers flash()得到Flash属性验证StatusResultMatchers status()得到响应状态验证器HeaderResultMatchers header()得到响应Header验证器CookieResultMatchers cookie()得到响应Cookie验证器ContentResultMatchers content()得到响应内容验证器JsonPathResultMatchers jsonPath(String expression, Object ... args)/ResultMatcher jsonPath(String expression, Matcher matcher)得到Json表达式验证器XpathResultMatchers xpath(String expression, Object... args)/XpathResultMatchers xpath(String expression, Mapstring, string namespaces, Object... args)得到Xpath表达式验证器ResultMatcher forwardedUrl(final String expectedUrl)验证处理完请求后转发的url绝对匹配ResultMatcher forwardedUrlPattern(final String urlPattern)验证处理完请求后转发的urlAnt风格模式匹配since spring4ResultMatcher redirectedUrl(final String expectedUrl)验证处理完请求后重定向的url绝对匹配ResultMatcher redirectedUrlPattern(final String expectedUrl)验证处理完请求后重定向的urlAnt风格模式匹配since spring4 六 一些常用的测试 1.测试普通控制器 mockMvc.perform(get(/user/{id}, 1)) //执行请求 .andExpect(model().attributeExists(user)) //验证存储模型数据 .andExpect(view().name(user/view)) //验证viewName .andExpect(forwardedUrl(/WEB-INF/jsp/user/view.jsp))//验证视图渲染时forward到的jsp .andExpect(status().isOk())//验证状态码 .andDo(print()); //输出MvcResult到控制台 2.得到MvcResult自定义验证 MvcResult result mockMvc.perform(get(/user/{id}, 1))//执行请求 .andReturn(); //返回MvcResult
Assert.assertNotNull(result.getModelAndView().getModel().get(user)); //自定义断言 3.验证请求参数绑定到模型数据及Flash属性 mockMvc.perform(post(/user).param(name, zhang)) //执行传递参数的POST请求(也可以post(/user?namezhang)) .andExpect(handler().handlerType(UserController.class)) //验证执行的控制器类型 .andExpect(handler().methodName(create)) //验证执行的控制器方法名 .andExpect(model().hasNoErrors()) //验证页面没有错误 .andExpect(flash().attributeExists(success)) //验证存在flash属性 .andExpect(view().name(redirect:/user)); //验证视图 4.文件上传 byte[] bytes new byte[] {1, 2};
mockMvc.perform(fileUpload(/user/{id}/icon, 1L).file(icon, bytes)) //执行文件上传 .andExpect(model().attribute(icon, bytes)) //验证属性相等性 .andExpect(view().name(success)); //验证视图 5.JSON请求/响应验证 String requestBody {\id\:1, \name\:\zhang\}; mockMvc.perform(post(/user) .contentType(MediaType.APPLICATION_JSON).content(requestBody) .accept(MediaType.APPLICATION_JSON)) //执行请求 .andExpect(content().contentType(MediaType.APPLICATION_JSON)) //验证响应contentType .andExpect(jsonPath($.id).value(1)); //使用Json path验证JSON 请参考http://goessner.net/articles/JsonPath/ String errorBody {id:1, name:zhang}; MvcResult result mockMvc.perform(post(/user) .contentType(MediaType.APPLICATION_JSON).content(errorBody) .accept(MediaType.APPLICATION_JSON)) //执行请求 .andExpect(status().isBadRequest()) //400错误请求 .andReturn(); Assert.assertTrue(HttpMessageNotReadableException.class.isAssignableFrom(result.getResolvedException().getClass()));//错误的请求内容体 6.异步测试 //Callable MvcResult result mockMvc.perform(get(/user/async1?id1namezhang)) //执行请求 .andExpect(request().asyncStarted()) .andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class))) //默认会等10秒超时 .andReturn(); mockMvc.perform(asyncDispatch(result)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath($.id).value(1)); 7.全局配置 mockMvc webAppContextSetup(wac) .defaultRequest(get(/user/1).requestAttr(default, true)) //默认请求 如果其是Mergeable类型的会自动合并的哦mockMvc.perform中的RequestBuilder .alwaysDo(print()) //默认每次执行请求后都做的动作 .alwaysExpect(request().attribute(default, true)) //默认每次执行后进行验证的断言 .build(); mockMvc.perform(get(/user/1)) .andExpect(model().attributeExists(user)); 转载于:https://www.cnblogs.com/williamjie/p/9145165.html