idea junit 测试看不到控制台报错信息_高手都这么给 Spring MVC 做单元测试!

5339fb91eeca8c89eccdd561198659e1.png

本章节主要讲解以下两部分内容:

1、Mock 测试简介

2、测试用例演示

一、Mock 测试简介

1、什么是 mock 测试

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

虚拟的对象就是 mock 对象。

mock 对象就是真实对象在调试期间的代替品。

2、为什么使用 mock 测试

避免开发模块之间的耦合

轻量、简单、灵活

3、MockMVC 介绍

基于 RESTful 风格的 SpringMVC 的测试,我们可以测试完整的 Spring MVC 流程,即从 URL 请求到控制器处理,再到视图渲染都可以测试。

1)MockMvcBuilder

MockMvcBuilder 是用来构造 MockMvc 的构造器,其主要有两个实现:StandaloneMockMvcBuilder 和 DefaultMockMvcBuilder,对于我们来说直接使用「静态工厂 MockMvcBuilders 创建」即可。

2)MockMvcBuilders

负责创建 MockMvcBuilder 对象,有两种创建方式:

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

「webAppContextSetup」(WebApplicationContext wac):指定 WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的 MockMvc,本章节下面测试用例均使用这种方式创建 MockMvcBuilder 对象。

3)MockMvc

对于服务器端的 SpringMVC 测试支持主入口点。通过 MockMvcBuilder 构造 MockMvcBuilder 由 MockMvcBuilders 建造者的静态方法去建造。

核心方法:perform(RequestBuilder rb) -- 执行一个 RequestBuilder 请求,会自动执行 SpringMVC 的流程并映射到相应的控制器执行处理,该方法的返回值是一个 ResultActions。

4)ResultActions

(1)「andExpect」:添加 ResultMatcher 验证规则,验证控制器执行完成后结果是否正确;

(2)「andDo」:添加 ResultHandler 结果处理器,比如调试时打印结果到控制台;

(3)「andReturn」:最后返回相应的 「MvcResult」;然后进行自定义验证 / 进行下一步的异步处理;

5)MockMvcRequestBuilders

用来构建请求的,其主要有两个子类 「MockHttpServletRequestBuilder *和」MockMultipartHttpServletRequestBuilder*(如文件上传使用),即用来 Mock 客户端请求需要的所有数据。

6)MockMvcResultMatchers

(1)用来匹配执行完请求后的「结果验证」

(2)如果匹配失败将抛出相应的异常

(3)包含了很多验证 API 方法

7)MockMvcResultHandlers

(1)结果处理器,表示要对结果做点什么事情

(2)比如此处使用 MockMvcResultHandlers.print() 输出整个响应结果信息

8)MvcResult

(1)单元测试执行结果,可以针对执行结果进行「自定义验证逻辑」

二、测试用例演示

1、添加依赖

<!-- spring 单元测试组件包 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.7.RELEASE</version>
</dependency>
<!-- 单元测试Junit -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>
</dependency>
<!-- Mock测试使用的json-path依赖 -->
<dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>2.2.0</version>
</dependency>

前两个 jar 依赖我们都已经接触过了,对于返回视图方法的测试这两个 jar 依赖已经足够了,第三个 jar 依赖是用于处理返回 Json 数据方法的,这里要明白每个 jar 的具体作用。

2、被测试的方法

@RequestMapping(value ="editItem")
public String editItem(Integer id, Model model) {
Item item = itemService.getItemById(id);
model.addAttribute("item", item);
return"itemEdit";
}
@RequestMapping(value ="getItem")
@ResponseBody
public Item getItem(Integer id) {
Item item = itemService.getItemById(id);
returnitem;
}

这里我们提供了两个方法,一个是返回视图的方法,另一个是返回 Json 数据的方法,下面我们会给出测试类,分别对这两个方法进行测试。

3、测试类:ItemMockTest

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ="classpath:spring/*.xml")
@WebAppConfiguration
public class ItemMockTest {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public voidinit() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
}

这里前两个注解就不再解释了,我们在学习 Spring 与 Junit 整合的时候已经讲解过了,这里说一下第三个注解:@WebAppConfiguration:可以在单元测试的时候,不用启动 Servlet 容器,就可以获取一个 Web 应用上下文。

1)返回视图方法测试

@Test
public voidtest() throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/editItem").param("id","1"))
.andExpect(MockMvcResultMatchers.view().name("itemEdit"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
Assert.assertNotNull(result.getModelAndView().getModel().get("item"));
}

d1dc719b55d444b4c9a5e9c27c43817f.png

这三句代码是我们对结果的期望,最后打印出了结果,说明执行成功,所有期望都达到了,否则会直接报错。从结果中我们就可以看到这个请求测试的情况。

2、返回 Json 数据方法

@Test
public void test1() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/getItem")
.param("id","1")
.accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.jsonPath("$.id").value(1))
.andExpect(MockMvcResultMatchers.jsonPath("$.name").value("IPhone X"))
.andDo(MockMvcResultHandlers.print())
.andReturn();
}

f0ddd2d7cf5374c3e9a02add2c567576.png

在这个方法中比较特殊的就是设置 MediaType 类型,因为都是使用 Json 格式,所以设置了 MediaType.APPLICATION_JSON,jsonPath 用于比对期望的数据是否与返回的结果一致,这里需要注意的是 "$.id" 这 key 的种形式。

三、小结

这里只是用到了 MockMvc 很小一部分知识,更加深入学习会使你养成一种良好编写单元测试的习惯,这是十分难得的一种好习惯,推荐去看官方文档,然后动手去测试一下,为你编写的每一个 Controller 方法进行测试,保证他们的可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows查询每个线程占用的内存_C#多线程

一、基本概念1、进程首先打开任务管理器&#xff0c;查看当前运行的进程&#xff1a;从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢&#xff1f;进程&#xff08;Process&#xff09;是Windows系统中的一个基本概念&#xff0c;它包含着一个运行程序所…

linux 录屏软件 按键,linux下常用的截图、录屏工具

linux下常用的截图、录屏工具(2010-01-05 10:47:21)由于和老公一起做一个百度俱乐部的小项目&#xff0c;在编写测试文档时要使用截图、录屏的小工具&#xff0c;于是展开搜索什么工具比较好使。录屏&#xff1a;在linux下常用的录屏工具有5种&#xff0c;可以baidu或者google下…

实体类blob类型_Mysql的数据类型和JPA的实体类

​MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、日期/时间和字符串(字符)类型。数值类型Int,4字节,(-2147483648&#xff0c;2147483647), (0,4294967295)BIGINT,8 字节,(-9223372036854775808,92…

python升级版本命令_如何在python中安装和配置kivy库

kivy是python的UI开发工具包&#xff0c;主要关注用户界面显示效果&#xff0c;可以在Android、IOS、Linux、OS X和Windows上运行。如果python开发中使用kivy&#xff0c;需要安装和配置相关文件和依赖模块。1、在电脑左下角打开开始菜单&#xff0c;输入cmd打开终端窗口在电脑…

linux系统如何安装bt5,BT5硬盘安装(多系统linux + win + BT5)

BT5硬盘安装(多系统linux win BT5)实际上&#xff0c;Win BT5的安装不是很困难&#xff0c;但据我所知我也有两种: 1如官方说明中所述&#xff0c;工具unetbootin&#xff0c;运行unetbootin&#xff0c;在“ CD映像”中&#xff0c;选择BT5的ISO&#xff0c;在“类型”中选…

android主板读取vga线数据_智锐通掘金新基建上新系列之3.5quot; 与ATX工业主板图鉴...

4月份&#xff0c;工信部正式公布了《工业互联网体系架构(版本2.0)》&#xff01;5G、大数据、人工智能、区块链、边缘计算等新技术加速融入并不断拓宽工业互联网的内涵与赋能潜力。新一代信息技术为驱动的数字浪潮正在深刻重塑经济社会各个领域的当前&#xff0c;智锐通科技聚…

Python 爬虫之下载视频(五)

爬取第三方网站视频 文章目录 爬取第三方网站视频前言一、基本情况二、基本思路三、代码编写四、注意事项&#xff08;ffmpeg&#xff09;总结 前言 国内主流的视频平台有点难。。。就暂且记录一些三方视频平台的爬取吧。比如下面这个&#xff1a; 一、基本情况 这次爬取的方…

c语言json映射,GitHub - xujun621/cson: 基于C语言的json数据映射解析库

CSON基于cJSON,运行于C语言平台的json-struct模型解析工具简介CSON是一个简单的cJSON的二次封装&#xff0c;相比于使用原生cJSON一层一层解析的方式&#xff0c;CSON采用模型映射的方式&#xff0c;使用模型将结构体的特征进行描述&#xff0c;然后根据模型&#xff0c;将json…

cad渐变线怎么画_怎么画压力线和支撑线

支撑线与压力线的基本画法画法&#xff1a;将两个或两个以上的相对低点连成一条直线即得到支撑线将两个或两个以上的相对高点连成一条直线即得到压力线用法&#xff1a;1.支撑线和压力线的作用支撑线又称为抵抗线。当股价跌到某个价位附近时&#xff0c;股价停止下跌&#xff0…

c语言为什么要建项目,一个C语言小项目为什么都说牛逼

原标题&#xff1a;一个C语言小项目为什么都说牛逼意在鼓励C语言学者。更有兴趣&#xff0c;学习更富有创业和乐趣&#xff01;推荐加学习交流群&#xff1a;658807522 可以在一起学习交流&#xff0c;既是参赛选手&#xff0c;又是学者&#xff0c;也可以先学习再参赛&#xf…

单片机c语言 oxfe,AVR单片机入门及C语言高效设计实践(五)

ATMEAGl6L的中断系统什么是“中断”?顾名思义中断就是中断某一工作过程去处理一些与本工作过程无关或间接相关或临时发生的事件&#xff0c;处理完后&#xff0c;则继续原工作过程。比如&#xff1a;你在看书&#xff0c;电话响了&#xff0c;你在书上做个记号后去接电话&…

android 生成 资源文件,SVG-Android开源库——SVG生成Vector资源文件的编辑预览工具...

Vector矢量图在Android项目中的利用愈来愈广泛&#xff0c;但是如果你想用Android Studio自带的工具将SVG图片转化成Vector资源文件却是相当麻烦&#xff0c;首先能支持的SVG规范较少&#xff0c;其次操作流程麻烦。而另外一种方式就是通过http://inloop.github.io/svg2android…

android微信朋友圈相册背景,Android 仿微信朋友圈图片拖拽返回

目前的app的动画效果是越来越炫了&#xff0c;很多主流app的图片预览返回都有类似功能&#xff0c;比较常见的是ios自带相册&#xff0c;微信朋友圈等等。自己项目中也有类似功能&#xff0c;最近整理了一下这个功能的代码&#xff0c;做个笔记记录&#xff0c;有兴趣的朋友可以…

erp采购总监个人总结_《用友 ERP 培训教程:财务核算/供应链管理/物料需求计划》ERP概述 : ERP基础知识...

第1章 ERP概述本章重点_- _ERP概要_- _ERP实施成功的必要条件_- _ERP几个重要的名词解释用友ERP-U8&#xff08;V8 .72&#xff09;简介及功能按钮说明1.1 ERP基础知识1.1.1 ERP基本概念ERP&#xff08;Enterprise Resources Planning&#xff09;中文叫做企业资源规划&…

soc 设计soc设计 uml实务手册_企业内训“软件需求设计建模方法学全程实例剖析”训练方案(2020年)...

※训练介绍※利润需求-设计。软件开发中&#xff0c;需求是解决“系统怎样好卖”的问题&#xff0c;设计是解决“降低开发成本”的问题。要迈向“低成本制造好卖的产品”的境界&#xff0c;并非喊喊口号就能达到。口号&#xff1a;我们只做最重要的需求&#xff0c;尽快把系统推…

鸿蒙分布式通讯子系统,【鸿蒙】分布式通信子系统--让华为手机发现Hi3861开发板...

目录&#xff1a;工具步骤运行结果工具&#xff1a;1. 华为手机&#xff0c;需要有多设备协同功能。在设置->更多连接->多设备协同&#xff0c;查看是否有多设备协同功能&#xff0c;此功能使用的就是coap协议。2. Hi3861开发板步骤&#xff1a;1. 修改源码&#xff0c;…

winform 统计大量数据重复的元素个数_DAY10——推断统计之概率与概率分布:常见的离散型概率分布...

「数学期望——某件事情大量发生之后的平均结果」----------------分割又分割----------------------昨天文章排版出了问题&#xff0c;今天重新排版。数据的三个统计维度&#xff1a;集中程度、离散程度、分布情况。集中程度&#xff1a;期望离散程度&#xff1a;方差、标准差…

xss跨站脚本攻击_常见攻击之xss跨站脚本攻击

前言随着互联网的不断发展&#xff0c;web应用的互动性也越来越强。相应的&#xff0c;在用户体验提升的同时安全风险也会跟着有所增加。今天&#xff0c;我们就来讲一讲web渗透中常见的攻击方式之一&#xff0c;XSS攻击。首先需要了解他是如何工作的&#xff0c;以及我们如何利…

缺陷调研报告_质量零缺陷 | 打造极致产品的质量管理之道

质量是政治质量是生命质量是效益为强化全员“零缺陷”质量意识&#xff0c;坚决打赢质量提升攻坚战&#xff0c;现开设“质量零缺陷”专栏&#xff0c;着力宣传全院各单位在加强质量管理&#xff0c;落实零缺陷理念等方面的典型做法和质量故事。今天为大家带来的是曾获得“全国…

oracle 从右往左截取_截取GIF、调分辨率、快捷拨号,三星这些功能让人爱不释手...

昨天三星5G手机正式上市后&#xff0c;今天又爆出苹果被三星拒绝后要转向华为购买5G芯片&#xff0c;苹果如此操作是真的走投无路了&#xff1f;再看看吃瓜群众们&#xff0c;吐槽一波接一波。​一会儿&#xff0c;嫌弃三星信号频段不完全&#xff0c;10nm的工艺制程太差。一会…