【MyBatis学习】Spring Boot(SSM)单元测试,不用打包就可以测试我们的项目了,判断程序是否满足需求变得如此简单 ? ? ?

news2024/12/24 2:57:58

前言:
大家好,我是良辰丫,在上一篇文章中我们学习了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层.

  1. 打开我们要测试的类或者接口(或者其它),然后右键选择Generate.

在这里插入图片描述

  1. 点击Test , 因为咱们要测试的是一个接口,因此Generate里面的东西比较少,如果测试类,还会有set等属性.
    在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

3.3 完善单元测试的代码

  1. 添加@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 {

    @Test
    void getStuId() {
    }
}
  1. 注入测试对象,通过属性注入把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 {
    @Autowired
    private StuMapper stuMapper;
    @Test
    void getStuId() {
    }
}
  1. 添加单元测试的业务代码

在这里插入图片描述

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 {
    @Autowired
    private StuMapper stuMapper;
    @Test
    void getStuId() {
        Stu stu = stuMapper.getStuId(1);
        System.out.println(stu);
    }
}
  1. 运行我们的单元测试代码,绿色的对钩表示我们测试成功,程序没有问题.

在这里插入图片描述

在运行完我们的单元测试代码之后,上面的运行块变成了我们的单元测试运行块,我们要想执行我们的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 {
    @Autowired
    private StuMapper stuMapper;
    @Test
    void 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 {
    @Autowired
    private StuMapper stuMapper;
    @Test
    void 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项目了,随着知识点的深入,我们也将不断完善我们的技能.

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

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

相关文章

SEO留痕霸屏技术原理实现分析

留痕效果 通常是查询某个关键词&#xff0c;出现大量搜索结果网页霸屏&#xff0c;而且都会引导到其他平台或者网站进行浏览和查看。留痕网站和指向网站或平台无关联。 示例图片&#xff1a; 原理分析 首先通过内容和链接很容易明白&#xff0c;本质上就是一个搜索页面&…

OpenAI API升级:新GPT-3.5 Turbo和GPT-4助力AIGC应用大放异彩

theme: orange 前言 北京时间2023年6月13日&#xff0c;OpenAI宣布对其领先的生成型AI模型GPT-3.5 Turbo和GPT-4进行一系列更新&#xff0c;以提高工作场所的人工智能能力。这些改进包括引入全新的函数调用功能、增强的可引导性、GPT-3.5 Turbo的扩展上下文&#xff0c;以及修订…

数值分析第九章节 用Python实现常微分方程初值问题的数值解法

参考书籍&#xff1a;数值分析 第五版 李庆杨 王能超 易大义编 第9章 常微分方程初值问题的数值解法 文章声明&#xff1a;如有发现错误&#xff0c;欢迎批评指正 文章目录 欧拉法后退的欧拉方法梯形方法改进欧拉公式补充龙格—库塔方法线性多步法阿当姆斯显示与隐式公式 9.1引…

5.3.3 因特网的路由协议(三)OSPF协议

5.3.3 因特网的路由协议&#xff08;三&#xff09;OSPF协议 前面我们学习了基于距离向量算法的路由信息协议RIP&#xff08;5.3.2 因特网的路由协议&#xff08;二&#xff09;基于距离向量算法的RIP协议&#xff09;,为了克服RIP协议的局限性于是就有了新的内部网关协议OSPF…

30行代码实现通用无限列表函数

前言&#xff1a; 前两天接到了一个需求&#xff0c;主要功能是实现类似于 B站 消息页面的那种效果&#xff0c;右侧几个 tab 都需要使用到无限加载的功能。 大家都知道&#xff0c;程序员是很懒的&#xff0c;不可能这几个页面全都写一遍重复的逻辑。所以在接到这个需求的时…

HBuilder连接手机模拟器调试,进行抓包

hbuilder连接手机模拟器 1.adb是什么&#xff1f;引用 2. 进行adb路径设置&#xff0c;选中模拟器中的adb路径&#xff0c;配置好端口&#xff0c;夜神模拟器端口&#xff1a;62001 3.运行到Andriod基座 在HBuilder连接模拟器过程中&#xff0c;对接口进行抓包 1.安装抓包工…

Spring Security --- 自定义Filter

简介任何 Spring Web 应用本质上只是一个 servletSecurity Filter在 HTTP 请求到达你的 Controller 之前过滤每一个传入的 HTTP请求Filter请求过滤器可以帮助进行HttpServletRequest请求和HttpServletResponse响应的过滤在自定义的Filter过滤器中可以对请求进行过滤&#xff0c…

控制并发流程,做好线程间的协调

一、概述 1. 什么是控制并发流程&#xff1f; 线程一般是由线程调度器自动控制的&#xff0c;但有些场景需要按照我们程序员的意愿去实现多线程之间相互配合&#xff0c;从而满足业务逻辑。比如&#xff1a; 让线程A等待线程B执行完后再执行等一些相互合作的逻辑&#xff1b…

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬步以至千里,就…

python打包后报错,无法启动,电脑缺少api-ms-win-core-path-11-1-0.dll

参考&#xff1a;《运行打包python程序时报&#xff1a;无法启动此程序&#xff0c;因为计算机中丢失 api-ms-win-core-path-l1-1-0.dll 尝试重新安装该程序以解决此问题。》 原因&#xff1a;python版本较高&#xff0c;打包时的python版本是python3.10&#xff0c;而运行打包…

mdBook介绍及使用——使用 Markdown 创建你自己的博客和电子书

目录 介绍一、下载与创建项目1.下载2.初始化3.结构说明 二、编写文章与启动1.编写文章2.构建3.启动 mdbook 服务 三、其他配置 介绍 mdBook 是一个使用 Markdown 创建书籍的命令行工具。它非常适合创建产品或 API 文档、教程、课程材料或任何需要清晰、易于导航和可定制的演示…

LED开关电源里的PCB回路设计应该怎么做?

LED开关电源的研发速度在最近几年中有了明显的技术飞跃&#xff0c;新产品更新换代的速度也加快了许多。作为最后一个设计环节&#xff0c;PCB的设计也显得尤为重要&#xff0c;因为一旦在这一环节出现问题&#xff0c;那么很可能会对整个的LED开关电源系统产生较多的电磁干扰&…

界面控件DevExtreme UI组件——增强的自定义功能

在本文中&#xff0c;我们将回顾DevExtreme UI组件在v22.2版本主要更新中一系列与自定义相关的增强。 DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#x…

6、微服务组件openfeign

1、在消费端的项目中引入openfeign依赖 首先需要确保引入了springcloud&#xff0c;因为openfeign依赖与springcloud 在消费端的pom.xml中引入openfeign&#xff0c;父项目中已经引入了springcloud了 <?xml version"1.0" encoding"UTF-8"?> <…

行云创新CloudOS助力蜂巢能源获中国信通院2023云原生应用优秀案例奖

2023 年 6 月 6 日&#xff0c;工业和信息化部主办的ICT 中国高层论坛-云原生产业高峰论坛成功举办&#xff0c;活动期间&#xff0c;中国信通院发布了“2023云原生应用优秀案例奖”获奖名单。其中&#xff0c;蜂巢能源作为中国新能源行业的代表之一&#xff0c;凭借其基于行云…

IKEA EDI项目开源介绍

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。 …

一次 Nacos 导致的 CPU 飙高问题完整复盘

今天下午突然 出现 测试环境 cpu飙高&#xff0c;干到了 60%&#xff0c;其他项目 响应时间明显变长。。。有点吓人&#xff0c;不想背锅 项目背景 出问题的项目是 需要连接各个不同nacos 和不同的 namespace 进行对应操作的 一个项目&#xff0c;对nacos的操作都是httpClien…

【工具】Maven加强版 — mvnd的使用

【工具】Maven加强版 — mvnd的使用 下载 Releases apache/maven-mvnd (github.com) 选对应的版本 我用的Windows版 1、安装 直接解压。 然后配置环境变量&#xff1a;将 bin 目录添加到 PATH 2、测试 打开CMD终端&#xff0c;输入 mvnd -v 可以看到如下信息表示安装成…

Linux入侵检测学习笔记2

查看异常流量&#xff1a; iftop&#xff1a;动态显示网络接口流量信息&#xff1a; iftop工具是一款实时流量监控工具&#xff0c;可用于监控TCP/IP连接等&#xff0c;必须以root用户的身份运行。 安装方法&#xff1a; yum install -y epel-release yum install -y iftop…

云服务器docker方式部署JAVA微服务

党建后端java微服务部署步骤&#xff08;采用docker部署&#xff09; 开通dua 开通端口号&#xff1a;8848、6379、8000 - 8010、9848、9849 step1&#xff1a;安装必要的一些系统工具 sudo apt-get update sudo apt-get install ca-certificates curl gnupg step2&#xff1a…