springmvc+mockmvc调试
javaweb项目在调试controller层时可能会需要重复部署打开服务器浪费大量的时间,spring和junit提供了测试的方法mockmvc
maven依赖(spring版本5.1.5.RELEASE)
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.10.19</version> <scope>test</scope> </dependency>
mockmvc执行的逻辑
1、MockMvcBuilder构造MockMvc的构造器;
2、mockMvc调用perform,执行一个RequestBuilder请求,调用controller的业务处理逻辑;
3、perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式;
4、使用StatusResultMatchers对请求结果进行验证;
5、使用ContentResultMatchers对请求返回的内容进行验证;
基本注解配置
@RunWith(SpringJUnit4ClassRunner.class) //加载运行器 @WebAppConfiguration() //注入webapplication //找spring的配置文件 @ContextConfiguration(locations = {"classpath:applicationContext.xml","classpath:springmvc.xml"})
构造MockMvcBuilder
private MockMvc mockMvc; @Autowired private WebApplicationContext wac; @Before public void setMockMvc() { mockMvc= MockMvcBuilders.webAppContextSetup(wac).build(); }
请求
MockHttpServletRequestBuilder request=get("url");
request.contentType(MediaType.APPLICATION_FORM_URLENCODED);
//如果是post请求 post("url").contentType(MediaType.APPLICATION_JSON).content(JSONObject.toJSONString(json对象));
String responseString=mockMvc.perform(request) .andExpect(status().isOk()) .andDo(print()).andReturn().getResponse().getContentAsString(); System.out.println(responseString);
具体
MockMvcRequestBuilders
RequestBuilder用来构建请求的,其提供了一个方法buildRequest(ServletContext servletContext)用于构建MockHttpServletRequest;其主要有两个子类MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如文件上传使用),即用来Mock客户端请求需要的所有数据。
主要API:
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:表示执行完成后返回相应的结果
如果出现如下报错,请检查你的servlet-api版本
java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig Caused by: java.lang.ClassNotFoundException: javax.servlet.SessionCookieConfig
如果报错的是2.5版本改成3.0.1版本它的artifactId与2.5版本不同
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency>
参考:https://www.cnblogs.com/jpfss/p/10950904.html