zoukankan      html  css  js  c++  java
  • 使用MockMvc测试Spring mvc Controller

    概述

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

    简介

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

    运行配置

    用到的注解

    • RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test组件进行单元测试;
    • WebAppConfiguration: 使用这个Annotate会在跑单元测试的时候真实的启一个web服务,然后开始调用Controller的Rest API,待单元测试跑完之后再将web服务停掉;
    • ContextConfiguration: 指定Bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;

    基本框架

    /**
     * 演示MockMVC使用
     * @author zhanyongzhi
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath*:**web-config.xml")
    @WebAppConfiguration
    public class MockMvcTest {
        private MockMvc mockMvc;
    
        @Autowired
        private WebApplicationContext webApplicationContext;
    
        @Before
        public void setUp() throws Exception {
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        }
    }

    测试逻辑

      校验Controller处理之后,请求是否为成功状态,返回的内容是否包含了:"{'foo':'bar'}"字符串。

    1 mockMvc调用perform,调用controller的业务处理逻辑
    2 perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式。
    3 使用StatusResultMatchers对请求结果进行验证
    4 使用ContentResultMatchers对请求返回的内容进行验证

    /**
     * 演示MockMVC使用
     * @author zhanyongzhi
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath*:**web-config.xml")
    @WebAppConfiguration
    public class MockMvcTest {
        private MockMvc mockMvc;
    
        @Autowired
        private WebApplicationContext webApplicationContext;
    
        @Before
        public void setUp() throws Exception {
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        }
    
        @Test
        public void demo() throws Exception {
            mockMvc.perform(get("/demo/test").accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
                   .andExpect(status().isOk())
                   .andExpect(content().contentType("application/json;charset=UTF-8"))
                   .andExpect(content().json("{'foo':'bar'}"));
        }
    }

    在 springboot中的使用

    package com.my.study.test;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.http.MediaType;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
    import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
    import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    
    import com.my.study.controller.UserController;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class UserControllerTest {
        private MockMvc mvc;
        
        @Before
        public void Setup() throws Exception{
            mvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
        }
    
        @Test
        public void getHello()  throws Exception{
            mvc.perform(MockMvcRequestBuilders.get("/user/test").accept(MediaType.APPLICATION_JSON))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andDo(MockMvcResultHandlers.print())
            .andReturn();
        
        }
    
    }

    完整代码在github中查看

    参考

    test mockmvc
    integration testing
    spring mvc unit test

  • 相关阅读:
    Linux 内核中的 Device Mapper 机制
    阿里云 Angular 2 UI框架 NG-ZORRO介绍
    Docker容器 暴露多个端口
    修改docker容器的端口映射
    Ubuntu Docker安装
    Docker容器技术的PaaS云平台架构设计***
    scala 学习笔记三 闭包
    scala 学习笔记二 方法与函数
    scala 学习笔记一 列表List
    Python3 写Windows Service服务程序
  • 原文地址:https://www.cnblogs.com/lukelook/p/10591715.html
Copyright © 2011-2022 走看看