在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;@Beforepublic void setUp() {APIController apiController = new APIController();mockMvc = MockMvcBuilders.standaloneSetup(apiController).build();}@Testpublic 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字段是否为trueAssert.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 {@Autowiredpublic WebApplicationContext wac;public MockMvc mockMvc;public MockHttpSession session;@Beforepublic void before() throws Exception {mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();}@Testpublic 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字段是否为trueAssert.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

转载于:https://www.cnblogs.com/haha12/p/srpingmvc-mock-test.html

Spring MVC如何测试Controller(使用springmvc mock测试)相关推荐

  1. spring mvc校验部分属性,springmvc校验属性,java.lang.ClassNotFoundException: com.fasterxml.classmate.Filter

    spring mvc校验部分属性,springmvc校验属性 转载请注明: TheViper http://www.cnblogs.com/TheViper 基于JSR303注解校验 问题的出现 一个 ...

  2. 【Spring MVC学习笔记 六】SpringMVC框架整合AJAX完成局部刷新

    本篇Blog介绍另一个常用的技术Ajax.虽然Ajax可以脱离SpringMVC去使用,但是SpringMVC对AJax有更好的支持 AJAX概念概述 AJAX即Asynchronous Javasc ...

  3. spring mvc学习(8):springmvc常用注解代码

    目录结构 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi= ...

  4. JAVA测试类注解以及Mock测试

    我们在项目中,经常要编写一个测试类XXXXXTest,其中一般会用到以下注解: 一.常用注解 1. @RunWith(PowerMockRunner.class) JUnit将会调用@RunWith中 ...

  5. Go单测测试 — 数据库 CRUD 的 Mock 测试

    今天继续跟着李文周大佬的博客学习Go的单元测试,最近在实践中也总结了一些如何用表格驱动的方式使用 gock Mock测试外部接口调用.以及怎么对GORM做mock测试,这些等这篇学完基础后,后面再单独 ...

  6. spring mvc学习(7):springmvc学习笔记(常用注解)

    1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如下特点: 不需要继承任何类, 也不需要实 ...

  7. java如何测controller层_用MockMvc对Spring mvc中的controller层进行单元测试

    参考:http://sishuok.com/forum/posts/list/7981.html  ;  http://www.tuicool.com/articles/6nqeIbm 用下面的这种方 ...

  8. spring mvc mysql 实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

    一.准备工作 1. 首先创建一个表: CREATE TABLE `t_user` ( `USER_ID` int(11) NOT NULL AUTO_INCREMENT, `USER_NAME` ch ...

  9. spring mvc 返回html 乱码,解决springmvc使用ResponseBody注解返回json中文乱码问题

    spring版本:4.2.5.RELEASE 查看"org.springframework.http.converter.StringHttpMessageConverter"源码 ...

最新文章

  1. 机器都会学习了,你的神经网络还跑不动?来看看这些建议
  2. mongodb的安装及主从复制
  3. 87岁的老奶奶喜欢用windows画图程序作画,而且画得还贼好!
  4. 华硕的服务器怎么看型号,怎么识别华硕主板型号
  5. Linux配置免密登录
  6. MIMIC 以太坊医疗项目开发(3)nodejs安装
  7. python中操作数据库中游标的使用方法
  8. GDCM:gdcm::Image的测试程序
  9. delphi5开发人员指南_成为企业家并发挥作用的开发人员指南
  10. 工控软件IFIX加入WEB显示图表
  11. Java 认证考试 OCAJP 经验总结
  12. KNN 算法实现 Iris 数据集分类
  13. linux+psp+模拟器下载,PSP1.5模拟器全教程+最新版本下载(最终版)
  14. 李大狗:从 Logo, Basic 到区块链 - Mixin Network 开发者访谈系列 第二期
  15. 计算机技术应用节课,矢志不渝追求卓越,上好每一节课—记滁州应用技术学校黄鹂...
  16. Promise的理解
  17. win7/win10 + VS2015 + cocos2dx-3.13的win32环境配置 与 项目编译时间优化和项目精简
  18. 楼天成 男人八题 多重背包问题O(VN)
  19. 基于java房屋租赁系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  20. 网页设计作业 开心网旅游(11页) web前端期末大作业 html+css+javascript网页设计实例

热门文章

  1. 《相关性准则——大数据时代的高效能之道》一一2.2 意识与大脑处理信息的能力...
  2. 关于C#winform程序运行无异常,在生成安装文件安装后提示水晶报表加载失败,系统找不到指定的路径的解决方法...
  3. [Web 开发] URL 的最大长度
  4. mysql外键读锁_MySQL的锁
  5. nodejs安装_nodejs调试全局安装的cli脚本
  6. mysql begin end 用法_数据库:Mysql中“select ... for update”排他锁分析
  7. 5-14卷积神经网添加正则化
  8. html1怎样插入视频,HTML视频教程,第1章 HTML初识
  9. 8cm等于多少像素_没诚意!红米Note 8 4800万像素是假的?网友:看看realme Q吧
  10. 分数加减乘除混合运算带答案_分数分数加减乘除混合运算练习题及答案_0.doc