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 注解

  1. @BeforeEach 和 @AfterEach:取代了 JUnit4 的 @Before 和 @After,作用于每个测试方法。
  2. @BeforeAll 和 @AfterAll:取代了 JUnit4 的 @BeforeClass 和 @AfterClass,可以作用于整个类生命周期,且在 JUnit5 中可以是非静态方法(通过注入 TestInstance)。
  3. @DisplayName:允许为测试方法和类指定自定义名称,方便生成更具可读性的测试报告。
  4. @Nested:支持嵌套的测试类,便于组织复杂的测试场景。
  5. @ParameterizedTest:增强了参数化测试的支持,允许为测试方法传递多个参数集。
  6. 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})`提前帮我们配置好了

差异概览

功能/特性JUnit4JUnit5Spring Test
架构单一模块模块化架构(Platform, Jupiter, Vintage)基于 TestContext 框架,与 JUnit 集成
注解@Test
, @Before
, @After
@Test
, @BeforeEach
, @AfterEach
@ContextConfiguration
, @Transactional
扩展机制@RunWith
, TestRule
@ExtendWith
, TestInstance
@ExtendWith(SpringExtension.class)
参数化测试较弱的参数化测试支持强大的参数化测试支持与 Spring 环境集成,支持 Mock 和依赖注入
事务管理N/AN/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");}
}

注意事项

  1. 使用断言进行判断,严禁System.out进行人工判断
  2. 丰富测试场景的多样性,通过不同参数测试增加多样性,提升测试覆盖率

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

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

相关文章

九芯电子NRK330X智能风扇离线语音控制方案

随着科技的快速发展,离线语音识别技术逐渐成为智能家居领域的重要组成部分。它能够将人类的语音转化为计算机可识别的数字信号,并在不需要联网的情况下,从而实现对各种设备的智能控制。在NRK330X智能风扇方案中,这一技术得到了广泛…

后端原型设计

一:导航设计 1.1 横向导航栏 常用于浏览器对客的系统。 1.2 纵向导航栏 纵向导航左边可以进行一级菜单和二级菜单,每个二级菜单右边还可以继续再使用标签栏进行导航三级分类。 头条号和CSDN都是采用该方式。 1.3 横纵结合导航栏 横向为一级菜单&…

Vue3.0组合式API:使用ref获取DOM元素

Vue3.0组合式API系列文章: 《Vue3.0组合式API:setup()函数》 《Vue3.0组合式API:使用reactive()、ref()创建响应式代理对象》 《Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器》 《Vue3.0组合式API&…

IDA Pro基本使用

IDA Pro基本使用 通过以下问题熟练掌握IDA Pro的使用 1.DllMain的地址是什么? 2.使用Imports 窗口并浏览到 gethostbyname,导入函数定位到什么地址? 3.有多少函数调用了gethostbyname? 4.将精力集中在位于0x10001757处的对 gethostbyname 的调用,你能找出哪个 D…

基于springboot+vue的教师薪酬管理系统(全套)

传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,老师信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的…

2024年汉字小达人区级自由报名备考冲刺:2024官方模拟题练一练

2024年第十一届汉字小达人的区级活动的时间9月25-30日正式开赛,不到一周就开始了。 如何最后冲刺汉字小达人比赛?根据我的经验,精准备考还是有希望的,也可以把这个比赛当做一个“练兵”——以赛促学,通过参加比赛的准…

找不到msvcp110dll怎么办,总结六种解决msvcp110dll丢失的方法

在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是“找不到msvcp110.dll”。这个问题通常是由于缺少或损坏了msvcp110.dll文件所引起的。那么,当我们遇到这个问题时,应该如何解决呢?本文将总结5个解决msvcp…

使用在线白板进行远程产品开发,客户量瞬间翻十倍!

自 2020 年新冠疫情爆发以来,各行各业都遭遇了前所未有的挑战。突如其来的隔离和封控措施让许多员工无法按时到公司上班。在这样的背景下,远程办公的需求迅速上升,协作白板成为了远程产品开发的新宠,为许多工程师提供了一个全新的…

MarsCode AI 一款免费的代码辅助工具,值得一试

更多请关注微信公众号:IT技术馆 MarsCode是一个功能强大的AI编程工具,由字节跳动旗下的公司推出,旨在提升开发者的编码效率和质量。以下是对MarsCode的详细解析: 地址: https://docs.marscode.cn/docs/introduction …

解决VSCode中Eslint插件无法自动折行的问题

问题描述 在.eslintrc.cjs 文件中写入了如下配置 代码过长时会出现黄色波浪线报错 但Ctrls保存却不能自动折行 具体表现是短时间内出现两次格式化,第一次格式化会将长代码自动拆行成短代码,但第二次格式化又将短代码变回了长代码(按Ctrlz可…

一文彻底搞懂大模型 - OpenAI o1(最强推理模型)

OpenAI o1 OpenAI o1于2024年9月13日正式发布,作为OpenAI最新发布的最强推理模型,标志着AI行业进入了一个新时代。o1在测试化学、物理和生物学专业知识的基准GPQA-diamond上,全面超过了人类博士专家,OpenAI宣称“通用人工智能(AG…

Linux 删除文件不释放空间问题处理

背景: 服务器磁盘空间已经达到100%,删除存放日志路径下的文件后,发现空间并未释放! 原因:在linux系统中,通过rm删除文件将会从文件系统的文件夹结构上解除链接(unlink)然后删除,然而假设文件是被…

开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-快速体验(十三)

一、前言 Qwen2.5 是通义千问团队在 2024 年9月19日云栖大会上发布的新一代开源模型,包含语言模型 Qwen2.5 及专门针对编程和数学的 Qwen2.5-Coder 和 Qwen2.5-Math。其中,Qwen2.5 语言模型在超过 18T 的数据集上预训练,显著提升了知识量和编…

VSCode配置、创建ROS项目简单记录

VSCode配置、创建ROS项目简单记录 说明记录1.安装WSL2.安装VSCode3.安装ROS noetic4.配置工作1)安装ROS插件2)创建自己的工作空间3)启动VSCode,编译ros程序4)运行 说明 win11下安装了WSL2,VSCode&#xff…

如何使用淘宝API获取买家秀数据?一份详细指南

什么是淘宝买家秀API? 淘宝买家秀API是淘宝开放平台提供的一种接口,它允许开发者通过编程方式获取淘宝商品的买家秀信息,包括买家上传的图片、视频、评论等内容。 为什么需要使用淘宝买家秀API? 提升商品质量:通过分…

数据结构应试-1

1. 好像是错的 2. n个元素,插入的可能有n1个位置,所以n(n1)/2*(n1)2/n 3. 4. 5. 6. 假设我们有一个循环队列,数组的长度为 n 10,并且当前队头指针 f 的位置是 2,队尾指针 r 的位置是 8。我们需…

如何ping通github

现象: 在浏览器上访问是正常的: 但是本地控制台ping就ping不通。 解决方案: 1.找到可用的ip http://ping.chinaz.com/https://github.com 如图如果能够找到可用ip的区域,直接点击得到ip地址 得到ip,比如&#xff…

cmake--find_path

作用 用于搜索指定文件或者目录所在的绝对路径(不包含文件或者目录本身),并将路径保存在指定变量中。 参数 find_path(common_DIRNAMES common.hPATHS ${CMAKE_SOURCE_DIR}/includePATH_SUFFIXES com_dirNO_DEFAULT_PATH) PATH_SUFFIXES 指定在include目录的com…

【Text2SQL】PET-SQL:在Spider基准测试中取得了SOTA

解读:PET-SQL: A Prompt-enhanced Two-stage Text-to-SQL Framework with Cross-consistency 这篇论文介绍了一个名为 PET-SQL 的文本到 SQL(Text-to-SQL)框架,旨在通过增强提示(prompt)和利用不同大型语言…

DCMM介绍

目录 一、介绍 二、核心摘要 三、体系大纲 四、能力评估 1、过程与活动 2、等级判定依据 3、访谈对象 一、介绍 通过阅读本书,您将洞悉国际数据框架体系,并掌握国家对于数据管理能力的权威评估标准与等级划分。本书详尽阐述了数据管理领域的八大核心能力域,以及这八大…