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

本文介绍SpringMVC中使用Mock测试的方法,包括mock测试的概念、目的及常用注解,并详细讲解独立安装与集成Web环境两种测试方式的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:https://www.linuxidc.com/Linux/2017-12/149851.htm

在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、卸载测试环境

为了搭建Spring MVC测试模块并启动它,你可以按照以下步骤来进行操作: ### 步骤一:创建Maven项目 首先需要通过IDE(如IntelliJ IDEA或Eclipse)或是命令行工具来建立一个新的Maven项目。 ### 步骤二:添加依赖项 编辑`pom.xml`文件,在其中加入必要的Spring框架及其相关的测试库作为项目的依赖。例如: ```xml <dependencies> <!-- Spring Web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- JUnit for testing --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!-- 其他所需的Spring或其他技术栈的依赖 --> </dependencies> ``` 请注意将`${spring.version}`替换为你想要使用的特定版本号。 ### 步骤三:配置Web应用结构 接下来你需要设置好基本的应用程序上下文和配置类,这通常涉及到创建几个重要的组件: * **主应用程序配置** (`AppConfig.java`) - 定义了Bean、数据源等信息; * **控制器层** (Controller Classes) - 负责处理HTTP请求; * **视图解析器** (如果有的话)- 将模型映射到实际页面上显示给用户; 对于Spring Boot来说,可以简化很多这样的工作,但对于非Boot环境,则需手动完成上述任务。 ### 步骤四:编写测试案例 现在我们可以开始准备单元及集成级别的测试用例了。这里以JUnit为例说明如何做简单的GET请求模拟: ```java @RunWith(SpringRunner.class) @WebMvcTest(controllers = MyController.class) public class ControllerTests { @Autowired private MockMvc mockMvc; @MockBean // 如果需要的话可以用这个注解引入服务之类的mock对象 @Test public void shouldReturnDefaultMessage() throws Exception { this.mockMvc.perform(get("/hello")) .andExpect(status().isOk()) .andExpect(content().string("Hello World")); } } ``` 上面的例子展示了怎样利用`@RunWith(SpringRunner.class)` 和 `@WebMvcTest` 注解快速地针对某个controller执行功能性的检查。 ### 启动服务端点 当所有准备工作完成后,如果你不是基于Spring Boot构建此应用,则还需单独部署WAR包至Servlet容器内运行,或者是直接借助于内置Tomcat服务器的方式让整个webapp跑起来供客户端访问APIs接口路径进行交互式调试以及后续更深入的功能验证。 以上就是关于“搭建Spring MVC测试模块”的大致流程啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值