保姆级教程:Spring Boot 单元测试
作者 | 小名同学
来源 | https://eamonyin.blog.csdn.net/
一、 单元测试的概念
概念:
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在Java中单元测试的最小单元是类。
单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。执行单元测试,就是为了证明这 段代码的行为和我们期望是否一致。
单元测试引用:
众所周知,通过spring initialize创建的Spring Boot项目会在Maven中自动携带很多starter依赖:
搞开源也会被死亡恐吓!
其中包含了一个名为spring-boot-starter-test
的依赖,本文是围绕这个依赖展开。
Spring Boot中引入单元测试很简单,添加如下依赖(即
spring-boot-starter-test
依赖):
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
spring-boot-starter-test有如下几个库:
spring-boot-starter-test
UML图:
@Autowire 和 @Resource 注解使用的正确姿势,别再用错的了!!
二、单元测试的作用
在没有接触单元测试之前我们是怎么做测试的?一般有两个方法:
在时间允许的情况下,编写单元测试是程序员对代码的自测,这是对自己代码的负责。
写单元测试的两个动机:
保证或验证实现功能。
保护已经实现的功能不被破坏。
三、Spring Boot引入的MockMvc的概念
什么是Mock?
在面向对象的程序设计中,模拟对象(英语:mock object)是以可控的方式模拟真实对象行为的假对象。在编程过程中,通常通过模拟一些输入数据,来验证程序是否达到预期结果。
为什么使用Mock对象?
使用模拟对象,可以模拟复杂的、真实的对象行为。如果在单元测试中无法使用真实对象,可采用模拟对象进行替代。
MockMvc的概念
MockMvc是由spring-test包提供,实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,使得测试速度快、不依赖网络环境。同时提供了一套验证的工具,结果的验证十分方便。
接口MockMvcBuilder,提供一个唯一的build方法,用来构造MockMvc。主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
Java实现pdf和Excel的生成及数据动态插入、导出
MockMVC的基本步骤
(1) mockMvc.perform执行一个请求。(2) MockMvcRequestBuilders.get(“XXX”)构造一个请求。(3) ResultActions.param添加请求传值 (4) ResultActions.accept()设置返回类型 (5) ResultActions.andExpect添加执行完成后的断言。(6) ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如处使用print()输出整个响应结果信息。(7) ResultActions.andReturn表示执行完成后返回相应的结果。
四、Service层的单元测试
第一步: Spring Boot中单元测试类写在src/test/java目录下,你可以手动创建具体测试类,也可以通过IDEA自动创建测试类,如下图:(注:点选并打开相应代码界面,再点击菜单栏的Navigate)
好用到爆!多种数据库只需一个工具就能搞定!
第二步: 按照第一步的方法,点击测试后,出现图一 的对话框(如果想要测试的类已经存在测试类了会被列出来,也可以重新创建一个新的测试类),点击”Create New Test…”会弹出图二 的对话框,可以选择是否生成setUp以及要测试的成员方法等:
图一
图二
超详细解读Java接口:模块通信协议以及默认方法和静态方法
第三步: 至此Service层的测试类就创建好了,测试类自动生成到了src/test/java目录下项目的同级目录中 ,如下图:
上云上的差点破产是什么体验?
Service层测试代码如下:
@SpringBootTest
@RunWith(SpringRunner.class)
public class XXXServiceTest {
@Resource
private XXXService XXXService;
@Test
public void conflictTime() {DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDate start = LocalDate.parse("2020-10-26", dtf);LocalDate end = LocalDate.parse("2020-10-31", dtf);Integer integer = XXXService.ConflictTime("10000001", start, end);Assert.assertThat(integer, Matchers.notNullValue());//assertThat断言后面介绍}
}
注解解释:
@SpringBootTest
:获取启动类,加载配置,寻找主配置启动类(被 @SpringBootApplication 注解的) @RunWith(SpringRunner.class)
:让JUnit运行Spring的测试环境,获得Spring环境的上下文的支持
五、Controller层的单元测试
创建测试类步骤见第四部分,此处略。
第四部分只是针对Service层做了测试,但是咱么也需要对Controller层(API)做测试,这时候就用到MockMvc了,它使得你无需启动项目工程就能测试这些接口
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
Controller层部分的代码将分为三个代码块讲解,里面有看不懂的代码先不要着急哦????,会在第五部分结尾处给大家汇总解答的,大家要坚持看到最后哟!????
代码块一:
@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class DfTaskRecordControllerTest {
@Autowired
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {System.out.println("---------------start---------------");save();
get();System.out.println("================end================");}
注解解释:
@SpringBootTest
>:获取启动类,加载配置,寻找主配置启动类(被 @SpringBootApplication 注解的)
@RunWith(SpringRunner.class)
>:让JUnit运行Spring的测试环境,获得Spring环境的上下文的支持 @AutoConfigureMockMvc
:用于自动配置MockMvc,配置后MockMvc类可以直接注入,相当于new MockMvc @Before
:初始化方法 ,对于每一个测试方法都要执行一次
代码块二:
@Test
@Transactional
@Rollback()
public void save() throws Exception {String json"{……}";
//执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;mockMvc.perform(MockMvcRequestBuilders.post("/XXX/save").content(json.getBytes()) //传json参数.accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_VALUE).header("Authorization","Bearer ********-****-****-****-************")).andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());}
注解解释:
@Transactional
:开启事务功能
@Rollback()
: 事务回滚,默认是true
代码块三:
@Test
public void get() throws Exception{ResultActions resultActions = mockMvc.perform(MockMvcRequestBuilders.get("/XXX/get").param("id", "**********").header("Authorization", "Bearer ********-****-****-****-************"));resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8");resultActions.andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());}
}
/get
运行结果如下:
本科毕业出国率下降,考研or保研?条条大路通「内卷」
现在将上面的一些琐碎的知识点汇总一下:
1. mockMvc.perform
:执行一个请求
2. MockMvcRequestBuilders.get(“/XXX/get”)
:构造一个请求,Post请求使用.post方法
3. contentType(MediaType.APPLICATION_JSON_VALUE)
:代表发送端发送的数据格式是application/json;charset=UTF-8
4. accept(MediaType.APPLICATION_JSON)
:代表客户端希望接受的数据类型为application/json;charset=UTF-8
5. header(“Authorization”,“Bearer XXXX”)
:代表在报文头添加一些必须的信息,这里添加的是token
6. ResultActions.andExpect
:添加执行完成后的断言
7. ResultActions.andExpect(MockMvcResultMatchers.status().isOk())
:方法看请求的状态响应码是否为200如果不是则抛异常,测试不通过
8. ResultActions.andDo
:添加一个结果处理器,表示要对结果做点什么事情,比如此处使用print():输出整个响应结果信息
六、断言的概念
断言(assert),是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。
使用断言是判断一个函数或对象的一个方法所产生的结果是否符合你期望那个结果。
七、新断言assertThat使用
JUnit 4.4 结合 Hamcrest 提供了一个全新的断言语法——assertThat。程序员可以只使用 assertThat 一个断言语句,结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想。
assertThat 的优点:
优点 1: 以前 JUnit 提供了很多的 assertion 语句,如:assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull 等,现在有了 JUnit 4.4,一条 assertThat 即可以替代所有的 assertion 语句,这样可以在所有的单元测试中只使用一个断言方法,使得编写测试用例变得简单,代码风格变得统一,测试代码也更容易维护。
优点 2: assertThat 使用了 Hamcrest 的 Matcher 匹配符,用户可以使用匹配符规定的匹配准则精确的指定一些想设定满足的条件,具有很强的易读性,而且使用起来更加灵活。
优点 3: assertThat 不再像 assertEquals 那样,使用比较难懂的“谓宾主”语法模式(如:assertEquals(3, x);),相反,assertThat 使用了类似于“主谓宾”的易读语法模式(如:assertThat(x,is(3));),使得代码更加直观、易读。
assertThat 的基本语法如下:
assertThat( [value], [matcher statement] );
value :接下来想要测试的变量值;matcher statement :使用 Hamcrest 匹配符来表达的对前面变量所期望的值的声明,如果 value 值与 matcher statement 所表达的期望值相符,则测试成功,否则测试失败。
八、Postman与Spring Boot 单元测试的区别
Spring Boot的单元测试主要针对方法层面,可以测试Service层这类非对外暴露的接口的类中方法,并且可一次性批量测试多个方法、支持事务回滚。
Postman针对接口进行http测试,我平时这个比较多,创建的测试接口可保存、分类。
九、Postman基本用法
Postman是一款功能强大的网页调试与发送网页HTTP请求的工具。Postman能够发送任何类型的HTTP请求(GET, HEAD, POST,PUT..),附带任何数量的参数和HTTP headers。支持不同的认证机制(basic, digest,OAuth),接收到的响应语法高亮(HTML,JSON或XML)。
安装Postman
官方网站:
https://www.getpostman.com/apps
安装后,Postman是介样婶儿滴~~????
如果你喜欢本文,欢迎关注我,订阅更多精彩内容
关注我回复「加群」,加入Spring技术交流群
往期推荐
搞开源也会被死亡恐吓!
@Autowire 和 @Resource 注解使用的正确姿势,别再用错的了!!
Java实现pdf和Excel的生成及数据动态插入、导出
好用到爆!多种数据库只需一个工具就能搞定!
超详细解读Java接口:模块通信协议以及默认方法和静态方法
上云上的差点破产是什么体验?
保姆级教程:Spring Boot 单元测试相关推荐
- Spring boot 保姆级教程,包学包会,授之以渔
相信很多初学java的朋友们,第一次接触spring boot肯定是或多或少有些懵的,尤其是对于 那些跳过spring直接学习spring boot的朋友们更是如此,不知道要踩多少坑,今天给朋友们带 ...
- Spring Boot 单元测试详解+实战教程
转载自 Spring Boot 单元测试详解+实战教程 Spring Boot 的测试类库 Spring Boot 提供了许多实用工具和注解来帮助测试应用程序,主要包括以下两个模块. spring ...
- spring boot单元测试
做一个稳健的开发,写一首漂亮的单元测试是少不了的 首先要分清几个概念:测试方法.测试类.测试集.测试运行器. 测试方法就是用 @Test 注解的一些函数. 测试类是包含一个或多个测试方法的一个 XxT ...
- 快速上手Springboot项目(登录注册保姆级教程)
本文章对SpringBoot开发后端项目结构做了简单介绍,并示范了使用SpringBoot+MySQL实现登录的后端功能,与本博客的另一篇文章 Vue 实现登录注册功能(前后端分离完整案例) | Ma ...
- 天才少年稚晖君 | 【保姆级教程】个人深度学习工作站配置指南
天才少年稚晖君 | [保姆级教程]个人深度学习工作站配置指南 来源:https://zhuanlan.zhihu.com/p/336429888 0. 前言 工作原因一直想配置一台自己的深度学习工作站 ...
- RocketMQ保姆级教程
上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作流程的讲解:第二部分就 ...
- CSGO饥荒服务器搭建保姆级教程
CSGO&饥荒服务器搭建保姆级教程 准备 第一步:软硬件 软件:Xshell.Xftp用于连接云服务器和进行文件传输. 进去填写邮箱,他会给你发个邮件,通过邮件获得下载链接,通过下载链接下载X ...
- 控制器Controller(保姆级教程)
控制器Controller(保姆级教程) 实现Controller接口 使用注解@Controller(声明Spring类的实例是一个控制器) 控制器复杂提供访问应用程序的行为 通常通过 接口定义和 ...
- ESP 保姆级教程 基础篇 —— 环境安装、NodeMcu引脚介绍
快速导读 1.安装 Arduino IDE -- 1.8.13 2.安装 ESP8266 -- 2.7.4 3.配置Arduino IDE 首选项 4.硬件开发板 -- ESP8266 NodeMcu ...
最新文章
- SQL2000联机丛书:使用和维护数据仓库
- Nature news: 未来40年,DNA测序将走向何方?
- Android--常驻BroadReceiver实现短信提醒
- Windows Server 2016 简介和安装
- 数制转换itoa atoi int转字符串 字符串转int string转int int转string
- Linux笔记-rpm与yum的基本概念
- 针对 SQL Server 2008 在Windows Server 2008上的访问配置 Windows 防火墙
- mysql ubuntu 注意点
- 网路游侠:计算机保密检查工具大全 2009版
- Flask 发布 1.0 稳定版
- C++中static关键字用法详解
- linuxYUM源配置问题
- 蓝屏dump分析教程,附分析工具WinDbg
- 计算机的组策略在什么地方,WINDOWS的常用组策略
- VMware16安装Win10系统图文教程
- 欧盟斥资18亿欧元 砸向网络安全领域——英国,你后悔了没?
- Vue 中使用Echarts构建3D地球
- Element ui 组件库 使用技巧。
- 用turtle画只小熊猫
- 19检查手机sim卡是否变更