Mock测试

2021-06-30  本文已影响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);
    }
}
上一篇下一篇

猜你喜欢

热点阅读