mockMvc使用教程

时间:2019-08-07
本文章向大家介绍mockMvc使用教程,主要包括mockMvc使用教程使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1. Mock测试介绍

  • 定义
    在单元测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟对象来创建以便测试的方法。
  • 为什么使用mock测试
    • 避免模块开发之间的耦合;
    • 轻量、简便、灵活;

2. MockMVC介绍

基于RESTful风格的SpringMVC单元测试,可以测试完整的SpringMVC流程,即从URL请求到控制处理器,带到视图渲染都可以测试。

2.1 MockMvc

  • 服务器端SpringMVC测试的主入口点。
  • 通过MockMVCBuilders建造者的静态方法去建造MockMVCBuilder,MockMvc由MockMVCBuilder构造。
  • 核心方法:perform(RequestBuilder rb),执行一个RequestBuilder请,会自动执行SpringMVC的流程并映射到相应的控制器执行处理,该方法的返回值是一个ResultActions。

2.2 MockMVCBuilder

  • MockMVCBuilder是使用构造者模式来构造MockMvc的构造器。
  • 主要有两个实现:StandaloneMockMvcBuilderDefaultMockMvcBuilder
  • 可以直接使用静态工厂MockMvcBuilders创建即可,不需要直接使用上面两个实现类。

2.3 MockMVCBuilders

  • 负责创建MockMVCBuilder对象。
  • 有两种创建方式
    • standaloneSetup(Object... controllers): 通过参数指定一组控制器,这样就不需要从上下文获取了。
    • webAppContextSetup(WebApplicationContext wac):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc

2.4 MockMvcRequestBuilders

  • 用来构建Request请求的。
  • 其主要有两个子类MockHttpServletRequestBuilderMockMultipartHttpServletRequestBuilder(如文件上传使用),即用来Mock客户端请求需要的所有数据。

2.5 ResultActions

  • andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确。
  • andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台。
  • andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理。
  • MockMvcResultMatchers
    • 用来匹配执行完请求后的**结果验证。
    • 果匹配失败将抛出相应的异常。
    • 包含了很多验证API方法。
  • MockMvcResultHandlers
    • 结果处理器,表示要对结果做点什么事情。
    • 比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。

2.6 MvcResult

单元测试执行结果,可以针对执行结果进行自定义验证逻辑。采用断言验证数据。

代码如下:

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.boke.Application;



/**
 * 演示MockMVC使用
 * @author zenglingsheng
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
@SpringBootTest(classes=Application.class)
public class NewApiControllerTest {
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
   
    
    @Test
    public void testEquipmenttypes() throws Exception {
        MvcResult authResult = null;
        authResult = mockMvc.perform(get("/api/workitem/equipmenttypes")//使用get方式来调用接口。
                .contentType(MediaType.APPLICATION_XHTML_XML)//请求参数的类型
                .param("sessionid", "ZlbpLxXw")//请求的参数(可多个)
        ).andExpect(status().isOk())
                .andReturn();
        //获取数据
        JSONObject jsonObject =new  JSONObject(authResult.getResponse().getContentAsString());
        JSONArray jsonArrayData = (JSONArray)jsonObject.get("data");
        
        //获取第一个Array中的值,判断查询到的结果。
        JSONObject jsonObject_data = null;
        if(jsonArrayData.length()>0){
            jsonObject_data = (JSONObject) jsonArrayData.get(0);
        }
        //加断言,判断属性值的问题。
        Assert.assertNotNull(jsonObject.get("error_code"));
        Assert.assertEquals(jsonObject.get("error_code"),0);
        Assert.assertNotNull(jsonObject.get("error_msg"));
        Assert.assertEquals(jsonObject.get("error_msg"),"操作成功");
        Assert.assertNotNull(jsonObject.get("data"));
        Assert.assertNotNull(jsonObject_data);
        Assert.assertEquals(jsonObject_data.get("equipmentty"),1);
        Assert.assertEquals(jsonObject_data.get("equipmenttypename"),"xxxxx");
        
   
    }
}

这是根据项目所测试的具体格式,测试数据时,测试到数据的最底层。萌新一枚,大神勿喷。

关联文章:https://www.jianshu.com/p/94e5de3f28c9

原文地址:https://www.cnblogs.com/zengls/p/11316454.html