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
posted @ 2020-03-14 11:52  一条土狗  阅读(698)  评论(0编辑  收藏  举报