使用MockMvc测试Spring mvc Controller

概述

  对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,这样会导致测试无法进行,为了可以对Controller进行测试,可以通过引入MockMVC进行解决。

简介

  MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。

运行配置

用到的注解

  • RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test组件进行单元测试;
  • WebAppConfiguration: 使用这个Annotate会在跑单元测试的时候真实的启一个web服务,然后开始调用Controller的Rest API,待单元测试跑完之后再将web服务停掉;
  • ContextConfiguration: 指定Bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;

基本框架

/**
 * 演示MockMVC使用
 * @author zhanyongzhi
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:**web-config.xml")
@WebAppConfiguration
public class MockMvcTest {
    private MockMvc mockMvc;
<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> WebApplicationContext webApplicationContext;

<span class="hljs-meta">@Before</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> setUp() <span class="hljs-keyword">throws</span> Exception {
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}

}

测试逻辑

  校验Controller处理之后,请求是否为成功状态,返回的内容是否包含了:"{'foo':'bar'}"字符串。

1 mockMvc调用perform,调用controller的业务处理逻辑
2 perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式。
3 使用StatusResultMatchers对请求结果进行验证
4 使用ContentResultMatchers对请求返回的内容进行验证

/**
 * 演示MockMVC使用
 * @author zhanyongzhi
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:**web-config.xml")
@WebAppConfiguration
public class MockMvcTest {
    private MockMvc mockMvc;
<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> WebApplicationContext webApplicationContext;

<span class="hljs-meta">@Before</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setUp</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> Exception </span>{
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}

<span class="hljs-meta">@Test</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">demo</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> Exception </span>{
    mockMvc.perform(get(<span class="hljs-string">"/demo/test"</span>).accept(MediaType.parseMediaType(<span class="hljs-string">"application/json;charset=UTF-8"</span>)))
           .andExpect(status().isOk())
           .andExpect(content().contentType(<span class="hljs-string">"application/json;charset=UTF-8"</span>))
           .andExpect(content().json(<span class="hljs-string">"{'foo':'bar'}"</span>));
}

}

完整代码在github中查看

参考

test mockmvc
integration testing
spring mvc unit test

原文地址:https://www.cnblogs.com/jpfss/p/10966990.html