Junit与Spring Test简单使用
Junit与Spring Test简单使用
- Junit5简介
- Junit5 注解
- Junit5与Spring结合
- 差异概览
- Mocking
- @MockBean
- @SpyBean
- Demo
- 注意事项
又要写测试代码了,总结记录一下。
Junit5简介
与单一模块设计的Junit4不同,Junit5引入了模块化架构,由三个主要子项目组成:
- JUnit Platform:测试运行的基础平台,支持不同的测试引擎(不仅仅是 JUnit,还可以扩展其他测试框架,如 TestNG)。
- JUnit Jupiter:JUnit5 的新编程模型和扩展模型,包含新的注解和测试方法(如 @Test, @BeforeEach,@AfterEach 等)。
- JUnit Vintage:提供对 JUnit4 及更早版本的向后兼容支持,因此 JUnit5 可以运行旧的 JUnit4 测试代码。
Junit5 注解
- @BeforeEach 和 @AfterEach:取代了 JUnit4 的 @Before 和 @After,作用于每个测试方法。
- @BeforeAll 和 @AfterAll:取代了 JUnit4 的 @BeforeClass 和 @AfterClass,可以作用于整个类生命周期,且在 JUnit5 中可以是非静态方法(通过注入 TestInstance)。
- @DisplayName:允许为测试方法和类指定自定义名称,方便生成更具可读性的测试报告。
- @Nested:支持嵌套的测试类,便于组织复杂的测试场景。
- @ParameterizedTest:增强了参数化测试的支持,允许为测试方法传递多个参数集。
- DynamicTest:动态创建测试用例,支持灵活的测试流程。
@BeforeAll``@AfterAll类级别,只执行一次
@BeforeEach@AfterEach方法级别,每个方法都会执行All 和 each的区别,在执行类级别测试时才能看出来: all仅执行一次,each执行次数取决于有多少个Test方法
Junit5与Spring结合
- 在与Spring集成时,不再使用@RunWith
- @ExtendWith, 指定拓展为Spring, 测试中可以使用Spring注解进行依赖注入,@ContextConfiguration指定配置类
- @Transactional, 测试中提供事务支持
- Spring框架提供的 @MockBean @SpyBean注解, 提供Mocking支持,模拟Bean行为
在springboot项目中,
@SpringBootTest注解内部就是使用了
@ExtendWith({SpringExtension.class})`提前帮我们配置好了
差异概览
| 功能/特性 | JUnit4 | JUnit5 | Spring Test |
|---|---|---|---|
| 架构 | 单一模块 | 模块化架构(Platform, Jupiter, Vintage) | 基于 TestContext 框架,与 JUnit 集成 |
| 注解 | @Test, @Before, @After | @Test, @BeforeEach, @AfterEach | @ContextConfiguration, @Transactional |
| 扩展机制 | @RunWith, TestRule | @ExtendWith, TestInstance | @ExtendWith(SpringExtension.class) |
| 参数化测试 | 较弱的参数化测试支持 | 强大的参数化测试支持 | 与 Spring 环境集成,支持 Mock 和依赖注入 |
| 事务管理 | N/A | N/A | 支持 @Transactional,测试完成后自动回滚 |
| Spring 集成 | @RunWith(SpringJUnit4ClassRunner.class) | @ExtendWith(SpringExtension.class) | 内置的对 Spring 上下文的管理和 Bean 注入支持 |
Mocking
@MockBean
如果不指定规则,则mockBean执行完返回默认值,即对象为null,数字为0
如果指定了规则,就按照规则返回,下面例子按照规则返回ok
@SpyBean
有规则按照规则走,没有规则按照真实服务进行。比如:在多服务调用过程中,如果部分服务不可用,可以定义规则,如果服务可用,则调用真实的服务。
Demo
import org.junit.jupiter.api.*;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.doReturn;@SpringBootTest
class DemoTestApplicationTests {@SpyBeanMyService myService;// 所有方法使用myService方法,可自定义覆盖@MockBeanMyService2 myService2; // 所有方法需要自定义返回,否则使用默认初始值或null// 调用Spy模拟服务,@Testvoid invokeSpy(){// 仅定义hello的mock规则doReturn("hello handsome").when(myService).hello("wyy");assertEquals("hello handsome", myService.hello("wyy"));// 未定义规则,直接调用say()逻辑assertEquals("hello", myService.say("hello"));}// 调用Mock模拟服务,@Testvoid invokeMock(){// 仅定义hello的mock规则doReturn("hello handsome").when(myService2).hello("wyy");assertEquals("hello handsome", myService2.hello("wyy"));// 未定义规则,返回初始值或nullassertEquals("hello", myService2.say("hello"));}// All 和 each的区别,执行单独的测试方法区分不了,// 在执行类级别测试时才能看出来: all仅执行一次,each执行次数取决于有多少个Test方法@BeforeAllstatic void beforeAll(){System.out.println("before all");}@BeforeEachvoid beforeEach(){System.out.println("before each");}@AfterEachvoid afterEach(){System.out.println("after each");}@AfterAllstatic void afterAll(){System.out.println("after all");}
}
注意事项
- 使用断言进行判断,严禁System.out进行人工判断
- 丰富测试场景的多样性,通过不同参数测试增加多样性,提升测试覆盖率
相关文章:
Junit与Spring Test简单使用
Junit与Spring Test简单使用 Junit5简介Junit5 注解Junit5与Spring结合 差异概览MockingMockBeanSpyBeanDemo 注意事项 又要写测试代码了,总结记录一下。 Junit5简介 与单一模块设计的Junit4不同,Junit5引入了模块化架构,由三个主要子项目组成: JUnit Pl…...
Vxe UI vue vxe-table 实现自适应列宽,根据内容自适应列的宽度
Vxe UI vue vxe-table 实现自适应列宽,根据内容自适应列的宽度 之前老版本是通过计算字符数量,然后给动态给每一列设置宽度,不仅麻烦,还不好复用。 看了 API 发现 v4.7 和 v3.9 版本已经直接就能支持了,只需加上 widt…...
document.visibilityState 监听浏览器最小化
1.document.hidden: 表示页面是否隐藏的布尔值。页面隐藏包括 页面在后台标签页中 或者 浏览器最小化 (注意,页面被其他软件遮盖并不算隐藏,比如打开的 sublime 遮住了浏览器)。 2.document.visibilityStateÿ…...
前端框架对比和选择
大家好,我是程序员小羊! 前言: 前端框架选择是前端开发中的关键决策,因为它影响项目的开发效率、维护成本和可扩展性。当前,最流行的前端框架主要包括 React、Vue 和 Angular。它们各有优劣,适用于不同…...
Linux 进程2
环境变量 再Linux操作系统中一切皆文件,这个环境变量自然也是一个文件,它的作用是辅助我们使用操作系统还可以辨识我们是什么用户(一般用户,root用户)。 env是读取完整环境变量的指令,里面记录了许多我登录操作系统所用的用户的信…...
WPF入门教学六 Grid布局进阶
在WPF(Windows Presentation Foundation)中,Grid布局是一种非常强大且灵活的布局控件,它允许你创建复杂的用户界面。以下是Grid布局的一些进阶技巧和教学: 一、基本概念回顾 Grid定义:Grid是一个用于布局…...
while循环及简单案例
//循环是流程控制中的一个重要分支 //流程控制 条件判断 循环 逻辑处理 //循环的目的和意义 //循环的目的是为了执行一块代码 //循环的意义是为了简化代码。增加代码的复用性 /* //例如输出0-100的数…...
电子看板实时监控数据可视化助力工厂精细化管理
在当今竞争激烈的制造业领域,工厂的精细化管理成为提高竞争力的关键。而电子看板实时监控数据可视化作为一种先进的管理工具,正为工厂的精细化管理带来巨大的助力。 一、工厂精细化管理的挑战 随着市场需求的不断变化和客户对产品质量要求的日益提高&am…...
邮储银行:面向金融行业的移动应用安全风险监测案例
本项目通过在移动应用中植入威胁情报探针并结合网络镜像流量方式,利用应用运行过程中设备、系统、应用、行为四个维度数据,将其与设备的关键因子关联生成唯一的移动设备指纹;对手机银行等应用资产进行资产台账梳理;结合服务端大数据分析平台的各种模型规则分析,实时监测移…...
ARMxy车辆数据采集Linux智能控制器
在当今科技日新月异的时代,高效智能的边缘计算设备在众多领域发挥着关键作用。我们的 ARM 边缘计算机,凭借其卓越的性能和广泛的适用性,成为车队管理智能化的核心力量。 一、强大硬件配置,完美适配车队管理需求 ARM 边缘计算机支…...
7.Java高级编程 多线程
Java高级编程 多线程 文章目录 Java高级编程 多线程一、进程与线程查看线程 二、线程创建方式三、线程状态四、线程常用方法五、线程安全 一、进程与线程 一个程序有一个进程 一个进程包含多个线程(必须有一个主线程) 并发: 在同一时刻&a…...
MT8370|MTK8370(Genio 510 )安卓核心板参数介绍
MTK Genio 510 (MT8370)安卓核心板是一款极为先进的高性能平台,专为满足边缘处理、先进多媒体功能及全面的连接需求而设计,适用于多种人工智能(AI)和物联网(IoT)应用场景。它具备多个高分辨率摄像头支持和可联网触摸屏显示,适用于使用多任务高…...
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
一、介绍 动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件&am…...
【STL】priority_queue 基础,应用与操作
c在C的标准模板库(STL)中,priority_queue 是一个基于堆的容器适配器,用于实现优先级队列。它本质上是一个最大堆(Max-Heap),即每次取出元素时,始终取出优先级最高的元素。本文将详细…...
tasklist命令的应用实例
tasklist命令的应用实例 引言 在系统管理和故障排查过程中,了解当前正在运行的进程信息是至关重要的。Windows操作系统提供了一个强大的命令行工具——tasklist,它可以帮助用户查看当前系统中所有正在运行的进程及其相关信息。掌握这个命令的使用&…...
基于协同过滤算法+PHP的新闻推荐系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤算法PHPMySQL的新…...
196页满分PPT | 集团流程优化及IT规划项目案例
细阐述了XX集团信息化建设的总体目标、指导原则、信息架构规划、应用系统架构规划、IT基础设施架构规划以及IT管控模式设计。文档内容涵盖了从现状分析到未来三年信息化建设目标的明确,以及如何通过IT系统支持集团的战略升级。 背景痛点 总体信息架构规划 总体信息架…...
Android 使用高德地图实现道格拉斯 - 普克算法
道格拉斯 - 普克算法(Douglas-Peucker algorithm)是一种用于曲线简化的算法。 一、算法的作用 该算法的主要目的是在保持曲线形状特征的前提下,通过减少数据点的数量来简化曲线。这在地图绘制、图形处理、地理信息系统等领域有广泛的应用。例…...
OpenAI GPT o1技术报告阅读(2)- 关于模型安全性的测试案例
✨报告阅读:使用大模型来学习推理(Reason) 首先是原文链接:https://openai.com/index/learning-to-reason-with-llms/ 接下来我们看一个简单的关于模型安全性的测试,当模型被问到一个有风险的话题时,会如何思考并回答用户呢&…...
Stream流的思想和获取Stream流
首先介绍流的概念: 流可以理解为一条流水线,在这条流水线中有许多操作,比如筛选所需要的数据,输出打印等, 经过这条流水线,可以获取到自己所需要的数据: -->所以: Stream流的作…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
