美文网首页
Mock测试

Mock测试

作者: 久伴我还是酒伴我 | 来源:发表于2021-06-30 15:09 被阅读0次

    简介

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

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

    MockMvc

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

    MockMVCBuilder

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

    MockMVCBuilders

    ★ 负责创建MockMVCBuilder对象。
    两种创建方式

    1. standaloneSetup: 通过参数指定一组控制器,这样就不需要从上下文获取了。
    2. webAppContextSetup:指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc。

    MockMvcRequestBuilders

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

    ResultActions

    ★ MockMvc.perform后将得到ResultActions
    ★ andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确。
    ★ andDo:添加ResultHandler结果处理器,如调试时打印结果到控制台。
    ★ andReturn:最后返回相应的MvcResult;然后进行自定义验证或下一步的异步处理。
    ★ MockMvcResultMatchers
    用来匹配执行完请求后的**结果验证。
    果匹配失败将抛出相应的异常。
    包含了很多验证API方法。
    ★ MockMvcResultHandlers 结果处理器,表示要对结果做处理的需要用到。

    具体代码

    package com.yutian.machine.cat;
    
    import com.alibaba.fastjson.JSON;
    import com.yutian.machine.cat.biz.order.dto.request.OrderRequest;
    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.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.MvcResult;
    import org.springframework.test.web.servlet.RequestBuilder;
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
    import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    import org.springframework.web.context.WebApplicationContext;
    
    /**
     * @author leijie.gao
     * @version 1.0.0
     * @ClassName BaseControllerTest.java
     * @Description TODO
     * @createTime 2021年06月30日 14:01:00
     */
    @SpringBootTest(classes = MachineCatApplication.class)
    @RunWith(SpringJUnit4ClassRunner.class)
    public class BaseControllerTest {
        private MockMvc mockMvc;
        @Autowired
        private WebApplicationContext context;
    
        @Before
        public void setUp(){
            mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
        }
    
        @Test
        public void testCpbCollect() throws Exception{
            HttpHeaders headers = new HttpHeaders();
            headers.add("kxl-company-tax-no","91610104724923046E");
            headers.add("kxl-system-version","4.0.10");
            headers.add("kxl-state-tax-url","https://fpdk.shaanxi.chinatax.gov.cn/");
            headers.add("kxl-ip","192.192.3.12");
            headers.add("kxl-rsa","rsa39");
            headers.add("kxl-token","93392-3002-30302302302-302-3032-0322");
    
            // 参数
            OrderRequest request = new OrderRequest();
            request.setCity("河南省");
            request.setCompanyName("dkjfdjkfd");
            request.setNum(12);
            request.setOrderName("HG-9292020002");
    
            RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/invoice/selection/cpbInvoiceCollect")
                    .contentType(MediaType.APPLICATION_JSON_VALUE).content(JSON.toJSONString(request))
                    .headers(headers);
            MvcResult mvcResult = mockMvc.perform(requestBuilder).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
            String resContent = mvcResult.getResponse().getContentAsString();
    
            Assert.assertNotNull(resContent);
        }
    }
    

    相关文章

      网友评论

          本文标题:Mock测试

          本文链接:https://www.haomeiwen.com/subject/wrsrultx.html