当前位置: 首页 > news >正文

Java Junit框架

JUnit 是一个广泛使用的 Java 单元测试框架,用于编写和运行可重复的测试。它是 xUnit 家族的一部分,专门为 Java 语言设计。JUnit 的主要目标是帮助开发者编写可维护的测试代码,确保代码的正确性和稳定性。

JUnit 的主要特点

  1. 注解驱动:JUnit 使用注解来标识测试方法、测试类、前置条件、后置条件等。
  2. 断言机制:JUnit 提供了一系列的断言方法(如 assertEquals, assertTrue, assertNull 等),用于验证测试结果是否符合预期。
  3. 测试套件:可以将多个测试类组合成一个测试套件,方便批量执行。
  4. 参数化测试:支持通过参数化测试来运行同一测试方法多次,每次使用不同的输入数据。
  5. 异常测试:可以测试代码是否抛出了预期的异常。
  6. 生命周期管理:提供了 @Before, @After, @BeforeClass, @AfterClass 等注解,用于管理测试的生命周期。

JUnit 的基本用法

1. 引入依赖

如果你使用 Maven 构建项目,可以在 pom.xml 中添加 JUnit 依赖:

<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.1</version><scope>test</scope>
</dependency>
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.8.1</version><scope>test</scope>
</dependency>
2. 编写测试类
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;class MyTest {@BeforeAllstatic void setUpAll() {// 在所有测试方法之前执行一次System.out.println("BeforeAll");}@BeforeEachvoid setUp() {// 在每个测试方法之前执行System.out.println("BeforeEach");}@Testvoid testMethod1() {// 测试方法1assertEquals(2, 1 + 1);}@Testvoid testMethod2() {// 测试方法2assertTrue(3 > 2);}@AfterEachvoid tearDown() {// 在每个测试方法之后执行System.out.println("AfterEach");}@AfterAllstatic void tearDownAll() {// 在所有测试方法之后执行一次System.out.println("AfterAll");}
}
3. 运行测试

你可以使用 IDE(如 IntelliJ IDEA、Eclipse)或命令行工具(如 Maven、Gradle)来运行测试。

JUnit 注解

  • @Test:标识一个方法为测试方法。
  • @BeforeAll:在所有测试方法之前执行一次,通常用于初始化资源。
  • @AfterAll:在所有测试方法之后执行一次,通常用于释放资源。
  • @BeforeEach:在每个测试方法之前执行,通常用于准备测试环境。
  • @AfterEach:在每个测试方法之后执行,通常用于清理测试环境。
  • @Disabled:禁用某个测试方法或测试类。
  • @DisplayName:为测试方法或测试类指定一个自定义的名称。
  • @ParameterizedTest:标识一个参数化测试方法。
  • @RepeatedTest:标识一个重复执行的测试方法。

JUnit 断言

JUnit 提供了多种断言方法来验证测试结果:

  • assertEquals(expected, actual):验证两个值是否相等。
  • assertNotEquals(unexpected, actual):验证两个值是否不相等。
  • assertTrue(condition):验证条件是否为真。
  • assertFalse(condition):验证条件是否为假。
  • assertNull(object):验证对象是否为 null
  • assertNotNull(object):验证对象是否不为 null
  • assertThrows(expectedType, executable):验证是否抛出了指定类型的异常。

JUnit 5 与 JUnit 4 的区别

JUnit 5 是 JUnit 的最新版本,与 JUnit 4 相比,它引入了许多新特性:

  • 模块化架构:JUnit 5 由多个模块组成,如 junit-jupiter-api, junit-jupiter-engine, junit-platform-runner 等。
  • 新的注解:如 @BeforeAll, @AfterAll, @DisplayName 等。
  • 扩展模型:JUnit 5 引入了扩展模型,允许开发者通过自定义扩展来增强测试功能。
  • 参数化测试:JUnit 5 提供了更强大的参数化测试支持。
  • 动态测试:允许在运行时生成测试用例。

4. JUnit 5 的高级特性

4.1 参数化测试

参数化测试允许你使用不同的输入数据运行同一个测试方法。

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.*;class ParameterizedTestExample {@ParameterizedTest@ValueSource(ints = {1, 2, 3})void testWithValueSource(int number) {assertTrue(number > 0);}
}

4.2 动态测试

动态测试允许在运行时生成测试用例。

import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;class DynamicTestExample {@TestFactoryStream<DynamicTest> dynamicTests() {return Stream.of(dynamicTest("1 + 1 = 2", () -> assertEquals(2, 1 + 1)),dynamicTest("3 > 2", () -> assertTrue(3 > 2)));}
}

4.3 禁用测试

使用 @Disabled 注解可以禁用某个测试方法或测试类。

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;class DisabledTestExample {@Test@Disabled("暂时禁用这个测试")void disabledTest() {fail("这个测试被禁用了,不应该执行");}
}

4.4 自定义测试名称

使用 @DisplayName 注解可以为测试方法或测试类指定一个自定义的名称。

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;@DisplayName("自定义测试类名称")
class DisplayNameTestExample {@Test@DisplayName("自定义测试方法名称")void customTestName() {assertEquals(2, 1 + 1);}
}

总结

JUnit 5 提供了丰富的功能和灵活的语法,能够满足大多数 Java 项目的单元测试需求。通过掌握核心注解、断言方法以及高级特性(如参数化测试和动态测试),你可以编写出高效、可维护的测试代码。无论是新手还是经验丰富的开发者,JUnit 都是一个不可或缺的工具。

相关文章:

Java Junit框架

JUnit 是一个广泛使用的 Java 单元测试框架&#xff0c;用于编写和运行可重复的测试。它是 xUnit 家族的一部分&#xff0c;专门为 Java 语言设计。JUnit 的主要目标是帮助开发者编写可维护的测试代码&#xff0c;确保代码的正确性和稳定性。 JUnit 的主要特点 注解驱动&…...

23种设计模式之《备忘录模式(Memento)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类&#xff0c;共23种&#xff1a; 1. 创建型模式&#xff08;Creational Patterns&#xff09; 单例模式&#xff08;Singleton&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供全局访问点。 工厂方法模式&#xff0…...

Seaborn知识总结

1、简介 &#xff08;1&#xff09;高级接口&#xff1a;Seaborn 提供了一组高级函数和方法&#xff0c;可以使得创建常见的统计图表变得简单&#xff0c;例如散点图、线性回归图、箱线图、直方图、核密度估计图、热图等等。无需像 Matplotlib 一样写大量的代码&#xff1b; …...

flowable中用户相关api

springboot引入flowable&#xff1a;高版本mysql报错 <!-- https://mvnrepository.com/artifact/org.flowable/flowable-spring-boot-starter --><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</art…...

java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类

&#xff08;以下内容全部来自上述课程&#xff09; 1.抽象类 父类定义抽象方法后&#xff0c;子类的方法就必须重写&#xff0c;抽象方法在的类就是抽象类。 1.定义 抽象方法 将共性的行为&#xff08;方法&#xff09;抽取到父类之后。由于每一个子类执行的内容是不一样…...

安装 Open WebUI

2025.03.01 早上 我已经安装了ollama 和deeseek模型 &#xff08;本地部署流水账之ollama安装Deepseek安装-CSDN博客&#xff09;&#xff0c;然后需要个与模型沟通的工具&#xff08;这么说不知道对不对&#xff09;。 刚开始用的chatbox&#xff0c;安装很方便&#xff0c;…...

Llama 2中的Margin Loss:为何更高的Margin导致更大的Loss和梯度?

Llama 2中的Margin Loss&#xff1a;为何更高的Margin导致更大的Loss和梯度&#xff1f; 在《Llama 2: Open Foundation and Fine-Tuned Chat Models》论文中&#xff0c;作者在强化学习与人类反馈&#xff08;RLHF&#xff09;的Reward Model训练中引入了Margin Loss的概念&a…...

【后端】Docker一本通

长期更新补充&#xff0c;建议关注收藏点赞 目录 Docker概述安装部署Docker基本操作使用docker部署tomcat使用docker部署mysql Docker概述 docker是⼀个应⽤级隔离的虚拟化技术docker三大核心概念 镜像&#xff1a;是具有源的所有特征的⼀个标记⽂件 仓库&#xff1a;存放镜像…...

工程化与框架系列(13)--虚拟DOM实现

虚拟DOM实现 &#x1f333; 虚拟DOM&#xff08;Virtual DOM&#xff09;是现代前端框架的核心技术之一&#xff0c;它通过在内存中维护UI的虚拟表示来提高渲染性能。本文将深入探讨虚拟DOM的实现原理和关键技术。 虚拟DOM概述 &#x1f31f; &#x1f4a1; 小知识&#xff1…...

数据结构之各类排序算法代码及其详解

1. 排序的概念 排序是一种常见的算法概念&#xff0c;用于将一组数据按照特定的顺序进行排列。排序算法的目的是将一组数据按照递增或递减的顺序重新排列。常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。排序算法的选择通常取决于数据规模、数据分布…...

【洛谷贪心算法】P1090合并果子

为了使消耗的体力最小&#xff0c;每次都应该选择当前重量最小的两堆果子进行合并。可以使用优先队列&#xff08;小根堆&#xff09;来实现这个过程&#xff0c;优先队列可以自动维护元素的顺序&#xff0c;每次取出堆顶的两个元素&#xff08;即最小的两个元素&#xff09;进…...

【告别双日期面板!一招实现el-date-picker智能联动日期选择】

告别双日期面板&#xff01;一招实现el-date-picker智能联动日期选择 1.需求背景2.DateTimePicker 现状图3.日期选择器实现代码4.日期选择器实现效果图5.日期时间选择器实现代码6.日期时间选择器实现效果图 1.需求背景 在用户使用时间查询时&#xff0c;我们经常需要按月份筛选…...

现今大语言模型性能(准确率)比较

现今大语言模型性能(准确率)比较 表头信息:表的标题为“大语言模型性能比较结果”(英文:Table 1: Large Language Model Performance Comparison Results),表明该表是用于对比不同大语言模型的性能。列信息: 模型:列出参与比较的不同大语言模型名称,包括LLAMA3(70B)…...

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图(水文,勿三)

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 这一节我们来学习指针的相关知识&#xff0c;学习内存和地址&#xff0c;指针变量和地址&#xff0c;包…...

在 UniApp 中实现中间凸起 TabBar 的完整指南

如何在 UniApp 中设置中间 TabBar 凸起效果 在移动应用开发中&#xff0c;TabBar 是常见的导航组件&#xff0c;而中间凸起的 TabBar 按钮则是一种流行的设计风格&#xff0c;常用于突出重要功能&#xff08;如发布、拍照等&#xff09;。UniApp 提供了 midButton 属性&#x…...

Redis大key

Redis大key基本概念&#xff0c;影响 Redis 大 key 指在 Redis 中存储了大量数据的键&#xff0c;它会对 Redis 的性能和内存管理产生影响。 大key的定义与value的大小和元素数量有关&#xff0c;但这个定义并不是绝对的&#xff0c;而是相对的&#xff0c;具体取决于系统的使用…...

WPF高级 | WPF 与数据库交互:连接、查询与数据更新

WPF高级 | WPF 与数据库交互&#xff1a;连接、查询与数据更新 前言一、数据库交互基础概念1.1 数据库简介1.2 数据访问技术 二、WPF 与数据库连接2.1 连接字符串2.2 建立连接 三、WPF 中的数据查询3.1 使用ADO.NET进行数据查询3.2 使用 Entity Framework 进行数据查询3.3 使用…...

CogBlobTool工具

CogBlobTool是一款专用于图像斑点检测于分析的 工具&#xff0c;通过灰度值阈值分割和特征过滤&#xff0c;帮助在复杂背景中提取目标区域&#xff0c;并计算几何属性。 效果图 注意&#xff1a;在这里只有一张图像可以不使用模板匹配工具 CogBlobTool工具的功能 斑点检测于…...

C# WinForm程序中如何调试dll接口

公司的SF系统是自主开发的。不同的机种会有不同数据记录保存的需求&#xff0c;尤其是客户SQE更是各种奇思妙想......于是做了一个接口&#xff0c;实践之下效果还不错呢。 每每总是忘记怎么调试接口&#xff0c;特记录下备查。首先要将&#xff0c; 1 DLL项目与WinForms项目…...

自然语言处理:词频-逆文档频率

介绍 大家好&#xff0c;博主又来给大家分享知识了。本来博主计划完成稠密向量表示的内容分享后&#xff0c;就开启自然语言处理中文本表示的讲解。可在整理分享资料的时候&#xff0c;博主发现还有个知识点&#xff0c;必须得单独拎出来好好说道说道。 这就是TF-IDF&#xf…...

手把手教你用Python+OpenBMI复现运动想象BCI实验(附完整代码与数据集)

Python实战&#xff1a;从OpenBMI到运动想象脑机接口的全流程复现指南在认知科学与脑机接口(BCI)研究领域&#xff0c;运动想象(Motor Imagery)实验一直是经典范式。传统上&#xff0c;这类实验多依赖Matlab生态完成&#xff0c;但随着Python在科学计算领域的崛起&#xff0c;越…...

保姆级教程:用Arbe或大陆4D毫米波雷达点云数据,手把手实现Freespace检测(附Python伪代码)

毫米波雷达点云实战&#xff1a;从数据到可行驶区域的完整工程指南在自动驾驶感知系统中&#xff0c;可行驶区域检测&#xff08;Freespace&#xff09;直接决定了车辆路径规划的可行空间边界。相比激光雷达和摄像头方案&#xff0c;4D毫米波雷达凭借全天候工作能力、成本优势和…...

孩子学英语怎么选择

需要一点点建议哦...

2024三星固件下载完整指南:Bifrost跨平台工具终极解决方案

2024三星固件下载完整指南&#xff1a;Bifrost跨平台工具终极解决方案 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 还在为三星设备固件下载而烦恼吗&#xff…...

2026年AI写作辅助平台实测排行,哪款真正适合一站式撰稿?

2026 年学术 AI 论文工具已形成全流程、理工 / 社科、英文 / 中文、免费 / 付费的清晰分化。综合实测排行与场景适配&#xff0c;千笔AI 是中文全能首选&#xff0c;DeepSeek 学术版是理工开源首选&#xff0c;毕业之家是国内毕业专属首选。 一、2026 年实测排行 TOP5&#xff…...

AI写论文真给力!4款AI论文生成工具,开启高效论文写作模式!

AI论文写作工具评测 还在为撰写期刊论文、毕业论文或职称论文而感到烦恼吗&#xff1f;在人工写作的过程中&#xff0c;面对那海量的文献资料&#xff0c;犹如在茫茫大海中捞针&#xff0c;而那些繁琐的格式要求更是让我们无从下手&#xff0c;不断的修改反复消耗我们的耐心&a…...

5G FWA智能终端技术解析:从核心架构到运营商集采实战

1. 项目概述&#xff1a;一次典型的5G FWA终端集采中标事件最近&#xff0c;业内传来一个挺有意思的消息&#xff0c;美格智能的5G FWA智能终端产品&#xff0c;在中国联通的一个招标项目中成功中标了。对于不熟悉通信行业的朋友来说&#xff0c;这听起来可能就是个普通的商业新…...

AI Agent游戏测试革命:自动生成10万+边界用例,覆盖率提升3.2倍——附可运行Python测试Agent源码

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI Agent游戏行业应用全景图 AI Agent 正在重塑游戏开发、运营与玩家体验的全生命周期。从智能NPC的行为建模&#xff0c;到自动化测试与关卡生成&#xff0c;再到实时个性化内容推荐与反作弊决策&…...

Poppler Windows版:终极PDF处理方案,3分钟零配置部署指南

Poppler Windows版&#xff1a;终极PDF处理方案&#xff0c;3分钟零配置部署指南 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows上复…...

预测编码在深度神经网络中的优势与应用

1. 预测编码在深度神经网络中的核心价值预测编码&#xff08;Predictive Coding, PC&#xff09;作为神经科学启发的机器学习范式&#xff0c;近年来在深度学习领域展现出独特优势。这种受大脑信息处理机制启发的方法&#xff0c;与传统的反向传播&#xff08;Backpropagation&…...