简介
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对象。
两种创建方式
- standaloneSetup: 通过参数指定一组控制器,这样就不需要从上下文获取了。
- 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);
}
}
网友评论