【MyBatis学习】Spring Boot(SSM)单元测试,不用打包就可以测试我们的项目了,判断程序是否满足需求变得如此简单 ? ? ?
前言:
大家好,我是良辰丫,在上一篇文章中我们学习了MyBatis简单的查询操作,今天来介绍一下Spring Boot(SSM)的一种单元测试,有人可能会感到疑惑,框架里面还有这玩意?什么东东呀,框架里面是没有这的,但是我们简单的学习一下单元测试,可以帮助我们自己测试代码,学习单元测试可以让我们少走很多弯路,毕竟,技多不压身,哈哈,废话不多说,我们往下看! ! !💌💌💌
🧑个人主页:良辰针不戳
📖所属专栏:javaEE进阶篇之框架学习
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。

目录
- 1. 初识单元测试
- 2. 单元测试有什么用?
- 3. 使用单元测试
- 3.1 引入单元测试框架
- 3.2 生成单元测试
- 3.3 完善单元测试的代码
- 4. 单元测试的断言
1. 初识单元测试
单元测试(unit testing)是指对软件中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试(这里的单元并没有明确的标准)。- 这里的
单元可以是一个函数,方法,类,功能模块或者子系统. - 单元测试是开发者编写的⼀⼩段代码,⽤于检验被测代码的⼀个很⼩的、很明确的(代码)功能是否正确。执⾏单元测试就是为了证明某段代码的执⾏结果是否符合我们的预期。如果测试结果符合我们的预期,称之为测试通过(测试成功),否则就是测试未通过(测试失败)。
2. 单元测试有什么用?
- 可以⾮常简单、直观、快速的测试某⼀个功能是否正确。
- 使⽤单元测试可以帮我们在打包的时候,发现⼀些问题,因为在打包之前,所以的单元测试必须通过,否则不能打包成功。这样可以减少问题发生的概率.
- 使⽤单元测试,在测试功能的时候,可以不污染连接的数据库,也就是可以不对数据库进⾏任何改变的情况下,测试功能. 也就是测试的时候构造一个假的数据库,并没有对真实的数据库进行修改.
3. 使用单元测试
3.1 引入单元测试框架
- 使用单元测试必须先引入单元测试的框架,也就是在pom.xml里面引入单元测试的依赖.
- 但是在我们的Spring Boot 项目里面,Spring Boot 项⽬创建时会默认单元测试框架 spring-boot-test,如果只创建一个maven项目,我们需要手动引入单元测试的依赖,⽽这个单元测试框架主要是依靠另⼀个著名的测试框架 JUnit 实现的.
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
3.2 生成单元测试
我们测试的代码是上一篇文章MyBatis中的mapper层.
- 打开我们要测试的类或者接口(或者其它),然后右键选择Generate.

- 点击Test , 因为咱们要测试的是一个接口,因此Generate里面的东西比较少,如果测试类,还会有set等属性.

我们先简单的认识一下各个模块,一般都不需要更改.

- 选择我们要测试的单元方法列表.

此时在我们的test目录里面就会生成一个测试类.

3.3 完善单元测试的代码
- 添加@SpringBootTest注解
在生成的单元测试类中加一个@SpringBootTest注解,这个注解表示该单元测试是在Spring Boot容器里面的,如果没有该注解,单元测试的好多Spring Boot的功能就不能用.
package com.example.demo.mapper;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;
//这个注解表示该单元测试是在Spring Boot容器里面的
@SpringBootTest
class StuMapperTest {@Testvoid getStuId() {}
}
- 注入测试对象,通过属性注入把StuMapper注入进来
package com.example.demo.mapper;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;
//这个注解表示该单元测试是在Spring Boot容器里面的
@SpringBootTest
class StuMapperTest {@Autowiredprivate StuMapper stuMapper;@Testvoid getStuId() {}
}
- 添加单元测试的业务代码

package com.example.demo.mapper;import com.example.demo.entity.Stu;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;
//这个注解表示该单元测试是在Spring Boot容器里面的
@SpringBootTest
class StuMapperTest {@Autowiredprivate StuMapper stuMapper;@Testvoid getStuId() {Stu stu = stuMapper.getStuId(1);System.out.println(stu);}
}
- 运行我们的单元测试代码,绿色的对钩表示我们测试成功,程序没有问题.

在运行完我们的单元测试代码之后,上面的运行块变成了我们的单元测试运行块,我们要想执行我们的Spring Boot项目,需要改一下.


4. 单元测试的断言
咱们在C语言里面就接触过断言了,但你真的了解断言嘛?
- 断言是用于对程序进行调试的,对执行结构进行一定的判断,而不是对业务流程的判断.
- 那么上述的语句怎么理解呢?我们可以把断言想象成一个if判断语句,如果满足,那么继续执行断言后面的程序 ; 如果不满足,那么抛出异常,后面的程序也将不会执行.
断言的方法表
| 方法名 | 作用 |
|---|---|
| assertEquals | 判断两个对象或者两个原始类型是否相等 |
| assertNotEquals | 判断两个对象或两个原始类型是否不相等 |
| assertSame | 判断两个对象引用是否指向同一个对象 |
| assertNotSame | 判断两个对象引用是否指向不同的对象 |
| assertTrue | 判断是否为true |
| assertFalse | 判断是否为false |
| assertNull | 判断对象的引用是否为null |
| assertNotNull | 判断对象的引用是否不为null |
注意 :
如果断⾔失败,则后⾯的代码都不会执⾏,这是非常重要的,打击一定要记住.
- 那么,接下来,我们就来在上一篇文章代码的基础上写上一个简单的断言,来简单看一下我们的程序运行结果.
- 下面是我们的单元测试代码,我们只是在单元测试的基础上加了一个断言.
package com.example.demo.mapper;import com.example.demo.entity.Stu;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;
//这个注解表示该单元测试是在Spring Boot容器里面的
@SpringBootTest
class StuMapperTest {@Autowiredprivate StuMapper stuMapper;@Testvoid getStuId() {Stu stu = stuMapper.getStuId(1);System.out.println(stu);//添加一个断言Assertions.assertEquals("李四",stu.getName());}
}
接下来,我们来看一下单元测试的运行结果.

那么,我们就明白了,预期结果和最终结果不一致的时候就不能通过单元测试.
接下来我们进行打包看一下结果.

测试单元没有通过测试的时候,打包也会失败.

接下来我们再来修改一下代码,让预期结果和最终结果相同.
package com.example.demo.mapper;import com.example.demo.entity.Stu;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;
//这个注解表示该单元测试是在Spring Boot容器里面的
@SpringBootTest
class StuMapperTest {@Autowiredprivate StuMapper stuMapper;@Testvoid getStuId() {Stu stu = stuMapper.getStuId(1);System.out.println(stu);Assertions.assertEquals("张三",stu.getName());}
}
我们看一下单元测试结果,发现此时已经通过了单元测试.

那么,我们此时进行打包呢,此时我们会成功的打包我们的代码.

下面是打包的包,如果我们想要在打包的时候直接改一个名字,我们可以在pom中稍微配置一下,包成功后包名就是我们设置的包名.

在build标签中引入打包的包名,注意,一定是在build标签中.
<finalName>ssm-prohect</finalName>
在project标签中引入打包的后缀名字,默认为jar.
<packaging>jar</packaging>
接下来我们来看一下我们的打包结果,下面就是我们指定的包名以及后缀名.

后序:
- 今天我们和大家简单学习一下单元测试,后序我们更加简答的判断我们的程序是否有问题.
- 为什么我们要在mybatis中引入单元测试呢?
因为进入mybatis中,我们就正式接触我们的SSM项目了,随着知识点的深入,我们也将不断完善我们的技能.
相关文章:
【MyBatis学习】Spring Boot(SSM)单元测试,不用打包就可以测试我们的项目了,判断程序是否满足需求变得如此简单 ? ? ?
前言: 大家好,我是良辰丫,在上一篇文章中我们学习了MyBatis简单的查询操作,今天来介绍一下Spring Boot(SSM)的一种单元测试,有人可能会感到疑惑,框架里面还有这玩意?什么东东呀,框架里面是没有这的,但是我们简单的学习一下单元测试,可以帮助我们自己测试代码,学习单元测试可以…...
JavaScript 类
本文内容学习于:后盾人 (houdunren.com) 1.可以使用类声明和赋值表达式定义类,推荐使用类声明来定义类 //类声明 class User {} console.log(new User()); //赋值表达式定义类 let Article class {}; console.log(new Article()); //类方法间不需要逗号…...
SpringBoot的static静态资源访问、参数配置、代码自定义访问规则
目录 1. 静态资源1.1 默认静态资源1.2 Controller高优先级1.3 修改静态资源的URL根路径1.4 修改静态资源的目录1.5 访问webjars依赖包的静态资源1.6 静态资源的关闭1.7 静态资源在浏览器的缓存1.8 静态资源实战1.9 通过代码自定义静态资源访问规则 1. 静态资源 查看源码如下&a…...
IO进、线程——线程(线程的创建、线程的退出、线程的回收、线程的分离和多线程并发编程)
线程 并发执行的轻量级进程 进程是资源分配的最小单位,线程是任务调度的最小单位 线程是进程的一部分,是任务调度的最小单位。一个进程可以包含多个线程,这些线程可以并发执行,共享进程的资源,但每个线程都有自己的…...
neo4j教程-Cypher操作
Cypher基础操作 Cypher是图形存储数据库Neo4j的查询语言,Cypher是通过模式匹配Neo4j数据库中的节点和关系,从而对数据库Neo4j中的节点和关系进行一系列的相关操作。 下面,通过一张表来介绍一下常用的Neo4j操作命令及相关说明,具…...
秋招算法备战第31天 | 贪心算法理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和
贪心算法理论基础 贪心算法并没有固定的套路,唯一的难点就是如何通过局部最优,推出整体最优。如何验证可不可以用贪心算法呢?最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧。刷题或者面试的时候…...
页面生成图片或PDF node-egg
没有特别的幸运,那么就特别的努力!!! 中间件:页面生成图片 node-egg 涉及到技术node egg Puppeteer 解决文书智能生成多样化先看效果环境准备初始化项目 目录结构核心代码 完整代码https://gitee.com/hammer1010_ad…...
go常用知识点
go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct 打包一个目录下的多个包时 go build ./… go install ./… 测试时,命令行:go test . //目录下所有单元测试都会执行 go test -v 目录 //测试覆盖率 go test -cover //使用cove…...
ComPDFKit PDF SDK(支持Web、Android、IOS、Windows、Server、API、跨平台)
1. SDK、API是什么? SDK是软件开发工具包的缩写,指的是一组用于开发软件应用的工具、库和文档。SDK包含一系列的函数、类和方法,开发人员可以使用这些工具和资源来开发、测试和部署应用程序。SDK可以提供各种功能和技术支持,如图…...
使用maven容器打包java项目
docker run --rm -v /path/to/your/microservice:/app -w /app maven:latest mvn clean package 解释一下上面的命令: docker run:运行Docker容器。--rm:在容器运行结束后自动删除容器,避免堆积未使用的容器。-v /path/to/you…...
超前端相关的学习网站和一些靠谱的小工具
CSS相关 1. CSS Battle - 在线比拼 CSS https://cssbattle.dev 在线比拼 CSS ,一个挺有趣的竞争性游戏,一共有12个级别,需要你用 HTML和 CSS 100%还原它给出的页面,然后再尽量减少代码,你也可以查看全球的排行榜&am…...
uniapp跳转到外部链接
// 一、先配置页面 {"path": "pages/webview/webview","style": {"navigationBarTitleText": ""} } // 二、编写页面 <template><web-view :src"src" /> </template><script> export def…...
初识DBT以及搭建第一个DBT工程
DBT是什么: 按照官方的说法,DBT 是一个数据转换流编排工具。个人理解就是,DBT是帮你编排SQL用的,你可以按照DBT的结构,构建好一个SQL的pipeline,然后让DBT帮你执行这个pipeline。我这里说的SQL pipeline的意…...
Python基于PyTorch实现卷积神经网络回归模型(CNN回归算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 卷积神经网络,简称为卷积网络,与普通神经网络的区别是它的卷积层内的神经元只覆…...
(AcWing)集合-Nim游戏
给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S。 现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合 S,最后无法进行操作的人视为失败。 问如果两人都采用最优策略,先…...
ConcurrentHashMap源码详解
本文已收录于专栏 《Java》 目录 概念说明数据结构线程安全HashMap示例运行结果ConcurrentHashMap示例运行结果 涉及技术Synchronized概念特性 CAS(Compare And Swap)概念原理代码演示没有使用CAS的代码运行结果使用CAS的代码运行结果 总结提升 概念说明 ConcurrentHashMap是Ja…...
医疗流程自动化盛行,RPA成为医疗保健行业的重点应用技术
随着我们进入新的科技纪元,机器人流程自动化(RPA)正快速地改变着我们的游戏规则。简单来说,RPA 就是模仿人类与电子系统的互动,自动化执行重复性的任务和操作序列。 医疗保健领域中,RPA 的应用具备巨大的潜…...
Java 版 spring cloud + spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
java重试机制实现方案
本文内容是目前团队内小磊同学对重试机制实现方案的梳理总结。 从为什么需要重试的背景开始,到重试的场景,大致的一些设计思路,最后通过两个成熟的retry组件进行案例讲解,理论实战。 背景 重试是系统提高容错能力的一种手段。在一…...
参数量仅有50KB的超轻量级unet变种网络egeunet【参数和计算量降低494和160倍】医疗图像分割实践
今天看到一篇挺有意思的文章,做的是跟医疗图像分割相关的工作,但是不像之前看到的一些工作一味地去追求高精度,因为医疗领域本身就是一个相对特殊的行业,对于模型产生的结果的精确性要求是很高的,带来的是参数量级的庞…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
