欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MockMvc单元测试

程序员文章站 2022-04-30 09:43:40
...

MockMvc单元测试

★ MockMvc - SpringMVC单元测试的独立测试:

一、简介

为何使用MockMvc?
对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,所以为了可以对Controller进行测试,我们引入了MockMVC。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。

二、测试逻辑

MockMvcBuilder构造MockMvc的构造器;

mockMvc调用perform,执行一个RequestBuilder请求,调用controller的业务处理逻辑;

perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式;

使用StatusResultMatchers对请求结果进行验证;

使用ContentResultMatchers对请求返回的内容进行验证;

三、MockMvcBuilder

MockMvc是spring测试下的一个非常好用的类,他们的初始化需要在setUp中进行。
MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,前者继承了后者。
① MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc;
② MockMvcBuilders.standaloneSetup(Object… controllers):通过参数指定一组控制器,这样就不需要从上下文获取了,比如this.mockMvc = MockMvcBuilders.standaloneSetup(this.controller).build();

四、MockMvcRequestBuilders

    从名字可以看出,RequestBuilder用来构建请求的,其提供了一个方法buildRequest(ServletContext servletContext)
    用于构建MockHttpServletRequest;其主要有两个子类MockHttpServletRequestBuilder和
    MockMultipartHttpServletRequestBuilder(如文件上传使用),即用来Mock客户端请求需要的所有数据。

五、ResultActions

调用MockMvc.perform(RequestBuilder requestBuilder)后将得到ResultActions,对ResultActions有以下三种处理:
ResultActions.andExpect:添加执行完成后的断言。添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确;
ResultActions.andDo:添加一个结果处理器,比如此处使用.andDo(MockMvcResultHandlers.print())输出整个响应结果信息,可以在调试的时候使用。

六、ResultMatchers

ResultMatcher用来匹配执行完请求后的结果验证,其就一个match(MvcResult result)断言方法,如果匹配失败将抛出相应的异常,spring mvc测试框架提供了很多***ResultMatchers来满足测试需求。
具体请百度。

七、MvcResult

即执行完控制器后得到的整个结果,并不仅仅是返回值,其包含了测试时需要的所有信息。
MockHttpServletRequest getRequest():得到执行的请求;
MockHttpServletResponse getResponse():得到执行后的响应;
Object getHandler():得到执行的处理器,一般就是控制器;
HandlerInterceptor[] getInterceptors():得到对处理器进行拦截的拦截器;
ModelAndView getModelAndView():得到执行后的ModelAndView;
Exception getResolvedException():得到HandlerExceptionResolver解析后的异常;
FlashMap getFlashMap():得到FlashMap;
Object getAsyncResult()/Object getAsyncResult(long timeout):得到异步执行的结果;
转自星朝

希望能够通过输入URL对Controller进行测试案例

导入依赖

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MockMvcController {
    @RequestMapping("/test/get_user")
    public String getUser(){
        return "测试通过。。。。";
    }
}

进行对/test/get_user地址进行测试


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
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;

/**
 * mockMvc
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringBoot02Application.class})
@AutoConfigureMockMvc
public class MockMvcTest {
    //首先注入MockMvc
    @Autowired
    private MockMvc mockMvc; //相当于http的客户端

    @Test
    public void test1() {
        try {
            MvcResult mvcResult= mockMvc.perform(MockMvcRequestBuilders.get("/test/get_user")).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
            int status = mvcResult.getResponse().getStatus();
            System.out.println("status="+status);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

如模仿get post put delete 请求案例可以参考下

相关标签: springboot