使用MockMvc测试Spring mvc Controller

概述

  对模块进行集成测试时,但愿可以经过输入URL对Controller进行测试,若是经过启动服务器,创建http client进行测试,这样会使得测试变得很麻烦,好比,启动速度慢,测试验证不方便,依赖网络环境等,这样会致使测试没法进行,为了能够对Controller进行测试,能够经过引入MockMVC进行解决。html

简介

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

运行配置

用到的注解

  • 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;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
}

测试逻辑

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

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

/**
 * 演示MockMVC使用
 * @author zhanyongzhi
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:**web-config.xml")
@WebAppConfiguration
public class MockMvcTest {
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void demo() throws Exception {
        mockMvc.perform(get("/demo/test").accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
               .andExpect(status().isOk())
               .andExpect(content().contentType("application/json;charset=UTF-8"))
               .andExpect(content().json("{'foo':'bar'}"));
    }
}

完整代码在github中查看web

参考

test mockmvc
integration testing
spring mvc unit testspring

相关文章
相关标签/搜索