• springboot使用MockMvc测试controller


      通常,在我们平时开发项目时,如果想要输入URL对Controller进行测试,在代码编辑之后,需要重启服务器,建立http client进行测试。这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,这样会导致测试无法进行,为了可以对Controller进行测试,可以通过引入MockMVC进行解决。

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

           MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应两种测试方式,即独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。对于我们来说直接使用静态工厂MockMvcBuilders创建即可。

    下面就写几个简单的案例,使用MockMvc测试Controller中的get请求和post请求。

    1.引入jar包

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    

    2.编写测试controller

    /**
     * @author Sue
     * @create 2019-09-06 10:03
     **/
    @RestController
    @RequestMapping("/mock")
    public class MockmvcController {
    
        /**
         * get请求
         * @param username
         * @param password
         * @return
         */
        @GetMapping("/getInfo")
        public R getInfo(String username,String password){
            System.out.println("username:" + username + "," + "password:" + password);
            return R.ok();
        }
    
        /**
         * post请求
         * @param username
         * @param password
         * @return
         */
        @PostMapping("/getInfo2")
        public R getInfo2(String username,String password){
            System.out.println("username:" + username + "," + "password:" + password);
            return R.ok();
        }
    
        /**
         * post请求接收json格式
         * @param user
         * @return
         */
        @PostMapping("/getInfo3")
        public R getInfo3(@RequestBody User user){
            System.out.println(user);
            return R.ok(user);
        }
    
    }

    3.创建单元测试

    idea使用快捷键ctrl+alt+t

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MockmvcTest {
        // 注入web环境的ApplicationContext容器
        @Autowired
        private WebApplicationContext context;
        /**
         * 模拟mvc测试对象
         */
        private MockMvc mockMvc;
    
        /**
         * 所有测试方法执行之前执行该方法
         */
        @Before // 这个注解的作用,在每个方法之前都会执行一遍
        public void before() throws Exception {
            //获取mockmvc对象实例
            mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
        }
    
        @Test
        public void getInfo() throws Exception {
            MvcResult mvcResult = mockMvc.perform(
                    MockMvcRequestBuilders.get("/mock/getInfo")
                            .param("username", "Jack")
                            .param("password", "Jack001"))
                            .andExpect(MockMvcResultMatchers.status().isOk())
                            .andDo(MockMvcResultHandlers.print()).andReturn();
            System.out.println("输出 " + mvcResult.getResponse().getContentAsString());
        }
    
        @Test
        public void getInfo2() throws Exception {
            MvcResult mvcResult = mockMvc.perform(
                    MockMvcRequestBuilders.post("/mock/getInfo2")
                            .accept(MediaType.APPLICATION_JSON)
                            .param("username", "Jack")
                            .param("password", "Jack001"))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andDo(MockMvcResultHandlers.print()).andReturn();
            System.out.println("输出 " + mvcResult.getResponse().getContentAsString());
        }
    
        @Test
        public void getInfo3() throws Exception {
            User user = new User();
            user.setUsername("Jack");
            user.setPassword("Jack001");
            String jsonString = JSON.toJSONString(user);
            MvcResult mvcResult = mockMvc.perform(
                    MockMvcRequestBuilders.post("/mock/getInfo3")
                            .contentType(MediaType.APPLICATION_JSON)
                            .content(jsonString)
                            .accept(MediaType.APPLICATION_JSON)
                    )
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andDo(MockMvcResultHandlers.print()).andReturn();
    
            int status = mvcResult.getResponse().getStatus();
            Assert.assertTrue("正确", status == 200);
    
            System.out.println("输出 " + mvcResult.getResponse().getContentAsString());
        }
    
    }
    

    4.测试

    代码解析 :

    • perform:执行一个RequestBuider请求,自动执行SpringMvc的流程并映射到相应的控制器执行处理
    • get: 声明一个发送get请求的方法. public static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) { return new MockHttpServletRequestBuilder(HttpMethod.GET, urlTemplate, uriVars);}这是个静态方法,可以直接导入,根据uri模版和uri的变量值得到一个get请求的方法. 另外提供了其他的请求方法, 如:postputdelete 等.
    • andExperct: 添加ResultMatcher验证规则,验证perform执行完成后的结果是否正确(对返回的数据进行判断)
    • andDo: 添加ResultHandler结果处理器,比如调试打印结果到控制台print()
    • andReturn: 最后返回相应的MvcResult,然后进行自定义验证/进行下一步的异步处理.

    整个测试过程如下:

    1、准备测试环境

    2、通过MockMvc执行请求

    3、添加验证断言

    4、添加结果处理器

    5、得到MvcResult进行自定义断言/进行下一步的异步请求

    6、卸载测试环境

    通过这几个方法,相信大家对mockMvc测试有了一些了解,如果想要使用更多细节,通过方法名和参数应该也能看懂方法含义,如果还是不能理解,可以查看下面的官方文档配合使用。

    官方文档 

    参考

  • 相关阅读:
    基于golang+openssh 服务实现一个简单的git over ssh 服务
    dremio 查询sql 执行参考流程
    几款开源git server ssh 协议forced command 参考格式
    dremio job 处理流程参考
    基于golang cgi 实现一个简单的git http server
    dremio cloud 分层datasets 实践
    flightsql apache arrow sql 扩展
    Docker 三剑客之 Docker Swarm
    查看docker服务状态
    SQL去重的三种方法汇总​
  • 原文地址:https://www.cnblogs.com/sueyyyy/p/11534047.html
Copyright © 2020-2023  润新知