详解Spring MVC如何测试Controller(使用springmvc mock测试)

 更新时间:2017年12月29日 08:37:43   作者:haha12  
这篇文章主要介绍了详解Spring MVC如何测试Controller(使用springmvc mock测试),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

1.什么是mock测试?

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

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

使用Mock O bject进行测试,主要是用来模拟那些在应用中不容易构造(如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、卸载测试环境

参考: spring-mvc-test-framework

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java打印出所有的水仙花数的实现代码

    Java打印出所有的水仙花数的实现代码

    这篇文章主要介绍了Java打印出所有的水仙花数的实现代码,需要的朋友可以参考下
    2017-02-02
  • hibernate中HQL如何调用自定义函数

    hibernate中HQL如何调用自定义函数

    这篇文章主要介绍了hibernate中HQL如何调用自定义函数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringBoot中EasyExcel实现Excel文件的导入导出

    SpringBoot中EasyExcel实现Excel文件的导入导出

    这篇文章主要介绍了SpringBoot中EasyExcel实现Excel文件的导入导出,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java10新特性解读

    Java10新特性解读

    这篇文章主要介绍了Java10新特性的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • Java垃圾回收机制简述

    Java垃圾回收机制简述

    这篇文章主要为大家详细介绍了Java垃圾回收机制的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 详解Spring Boot 项目启动时执行特定方法

    详解Spring Boot 项目启动时执行特定方法

    这篇文章主要介绍了详解Spring Boot 项目启动时执行特定方法,Springboot给我们提供了两种“开机启动”某些方法的方式:ApplicationRunner和CommandLineRunner。感兴趣的小伙伴们可以参考一下
    2018-06-06
  • IDEA 2022 CPU占用100%的问题及解决方法

    IDEA 2022 CPU占用100%的问题及解决方法

    这篇文章主要介绍了IDEA 2022 CPU占用100%问题及解决方法,其实解决方法很简单,只需要禁用三个插件然后重启idea即可成功解决,需要的朋友可以参考下本文
    2022-08-08
  • Java基础题新手练习(二)

    Java基础题新手练习(二)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Java 获取网络302重定向URL的方法

    Java 获取网络302重定向URL的方法

    在本篇文章里小编给大家整理的是关于Java 获取网络302重定向URL的方法以及相关知识点,有兴趣的朋友们参考下。
    2019-08-08
  • Spring RestTemplate的使用与踩坑

    Spring RestTemplate的使用与踩坑

    RestTemplate是一个执行HTTP请求的同步阻塞式工具类,它仅仅只是在HTTP客户端库基础上,封装了更加简单易用的模板方法API,方便程序员利用已提供的模板方法发起网络请求和处理,能很大程度上提升我们的开发效率
    2023-02-02

最新评论