zoukankan      html  css  js  c++  java
  • Spring MVC如何测试Controller(使用springmvc mock测试)

    在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码。 

    1.什么是mock测试?

    mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

    2.为什么要使用mock测试?

    使用Mock Object进行测试,主要是用来模拟那些在应用中不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JDBC中的ResultSet对象)从而使测试顺利进行的工具。

    3.常用注解

    RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test组件进行单元测试;

    WebAppConfiguratio: 使用这个annotation会在跑单元测试的时候真实的启一个web服务,然后开始调用Controller的Rest API,待单元测试跑完之后再将web服务停掉;

    ContextConfiguration: 指定Bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;

    4.安装测试环境
    spring mvc测试框架提供了两种方式,独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。

    •  独立安装测试方式

    MockMvcBuilders.standaloneSetup(Object... controllers):通过参数指定一组控制器,这样就不需要从上下文获取了;

    主要是两个步骤:
    (1)首先自己创建相应的控制器,注入相应的依赖
    (2)通过MockMvcBuilders.standaloneSetup模拟一个Mvc测试环境,通过build得到一个MockMvc

    代码如下:

    package com.xfs.test;
    
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.MvcResult;
    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.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.xfs.web.controller.APIController;
    
    /**
     * 独立安装测试方式 springmvc mock测试
     *
     * @author admin
     *
     * 2017年11月23日 上午10:39:49
     */
    public class TestApiOne {
    
        private MockMvc mockMvc;
    
        @Before
        public void setUp() {
            APIController apiController = new APIController();
            mockMvc = MockMvcBuilders.standaloneSetup(apiController).build();
        }
    
        @Test
        public void testGetSequence() {
            try {
                MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/api/getSequence"))
                                    .andExpect(MockMvcResultMatchers.status().is(200))
                                    .andDo(MockMvcResultHandlers.print())
                                    .andReturn();
                int status = mvcResult.getResponse().getStatus();
                System.out.println("请求状态码:" + status);
                String result = mvcResult.getResponse().getContentAsString();
                System.out.println("接口返回结果:" + result);
                JSONObject resultObj = JSON.parseObject(result);
                // 判断接口返回json中success字段是否为true
                Assert.assertTrue(resultObj.getBooleanValue("success"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    请求结果如下:

     

    •  集成Web环境方式

     MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc;

     主要是三个步骤:

    (1)@WebAppConfiguration:测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的;value指定web应用的根
    (2)通过@Autowired WebApplicationContext wac:注入web环境的ApplicationContext容器
    (3)然后通过MockMvcBuilders.webAppContextSetup(wac).build()创建一个MockMvc进行测试

    代码如下:

    package com.xfs.test;
    
    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.mock.web.MockHttpSession;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
    import org.springframework.test.context.web.WebAppConfiguration;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.MvcResult;
    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 org.springframework.web.context.WebApplicationContext;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    
    /**
     * 集成Web环境方式 springmvc mock测试
     *
     * @author admin
     *
     * 2017年11月23日 上午11:12:43
     */
    @RunWith(JUnit4ClassRunner.class)
    @WebAppConfiguration
    @ContextConfiguration(locations = { "classpath*:spring/*.xml" })
    public class TestApiTwo extends AbstractJUnit4SpringContextTests {
    
        @Autowired
        public WebApplicationContext wac;
    
        public MockMvc mockMvc;
    
        public MockHttpSession session;
    
        @Before
        public void before() throws Exception {
            mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
        }
    
        @Test
        public void testGetSequence() {
            try {
                MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/api/getSequence"))
                                    .andExpect(MockMvcResultMatchers.status().is(200))
                                    .andDo(MockMvcResultHandlers.print())
                                    .andReturn();
                int status = mvcResult.getResponse().getStatus();
                System.out.println("请求状态码:" + status);
                String result = mvcResult.getResponse().getContentAsString();
                System.out.println("接口返回结果:" + result);
                JSONObject resultObj = JSON.parseObject(result);
                // 判断接口返回json中success字段是否为true
                Assert.assertTrue(resultObj.getBooleanValue("success"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    运行结果和上面独立测试时候一样。

    总结:

    整个过程:
    1、mockMvc.perform执行一个请求;
    2、MockMvcRequestBuilders.get("/user/1")构造一个请求
    3、ResultActions.andExpect添加执行完成后的断言
    4、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
    5、ResultActions.andReturn表示执行完成后返回相应的结果。

    整个测试过程非常有规律:
    1、准备测试环境
    2、通过MockMvc执行请求
    3、添加验证断言
    4、添加结果处理器
    5、得到MvcResult进行自定义断言/进行下一步的异步请求
    6、卸载测试环境

     参考:

    https://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#spring-mvc-test-framework

  • 相关阅读:
    Android微信九宫格图片展示控件
    ImageView设置rounded corner
    Android TitleBar推荐
    《Windows核心编程》目录索引
    《Windows内核分析》专题-索引目录
    wchar,char,string,wstring互转
    键盘过滤
    串口过滤
    Vmware中Linux 虚拟机与Windows物理机建立共享文件夹
    遍历某一进程模块
  • 原文地址:https://www.cnblogs.com/haha12/p/srpingmvc-mock-test.html
Copyright © 2011-2022 走看看