【SpringBoot】31 核心功能 - 单元测试 - JUnit5 单元测试中的断言机制——验证你的代码是否按预期执行了 - 详解

news/2025/11/30 12:26:29/文章来源:https://www.cnblogs.com/ljbguanli/p/19289043

【SpringBoot】31 核心功能 - 单元测试 - JUnit5 单元测试中的断言机制——验证你的代码是否按预期执行了 - 详解

文章目录

    • 前言
    • 一、什么是断言?为什么它这么重要?
    • 二、简单断言:最常用的几个
      • 1. `assertEquals`
      • 2. `assertNotEquals`
      • 3. `assertSame` / `assertNotSame`
      • 4. `assertTrue` / `assertFalse`
      • 5. `assertNull` / `assertNotNull`
    • 三、数组断言:对比数组是否一致
    • 四、组合断言:一次性验证多个条件
    • 五、异常断言:测试代码是否抛出预期异常
    • 六、超时断言:防止测试卡死
    • 七、快速失败:直接让测试失败
    • 八、实战案例:测试 Redis 连接
    • 九、总结:断言是测试的灵魂
    • 十、写在最后


前言

大家好,我是正在写单元测试的“小开发”一枚。最近在项目里用 JUnit5 做测试,发现了一个特别重要的东西——断言(Assertions)。一开始我也觉得“不就是判断一下结果对不对吗?”,但真正用起来才发现,它不只是“判断”,而是整个测试逻辑的“大脑”。

今天就来和大家聊聊我在实际开发中是如何一步步理解并使用 JUnit5 的断言机制 的。我会像平时写代码一样,一边讲思路,一边贴代码,顺便看看测试效果,保证你一看就懂!


一、什么是断言?为什么它这么重要?

先说点基础的。

断言(assertions),是单元测试的核心部分。它的作用是:验证你的代码是否按预期执行了

比如你写了个加法函数 add(a, b),你期望 add(2, 3) 返回 5。那你就得用断言去检查这个返回值是不是真的等于 5。

如果等于 → 测试通过 ✅
如果不等于 → 测试失败 ❌

这就是断言的作用。

在 JUnit5 中,所有断言都是静态方法,来自 org.junit.jupiter.api.Assertions 类。我们接下来一个个来看。


二、简单断言:最常用的几个

这是最基础的断言,用来做简单的值判断。

1. assertEquals

判断两个值是否相等。

@Test
@DisplayName("简单断言:相等")
public void testEquals() {
int result = 2 + 3;
assertEquals(5, result);
}

✅ 效果:如果 result 是 5,测试通过;否则报错。


2. assertNotEquals

判断两个值是否不相等。

@Test
@DisplayName("简单断言:不相等")
public void testNotEquals() {
int result = 2 + 3;
assertNotEquals(6, result);
}

✅ 如果结果不是 6,就通过;如果是 6 就失败。


3. assertSame / assertNotSame

判断两个引用是否指向同一个对象。

@Test
@DisplayName("引用相同")
public void testSame() {
String str1 = "hello";
String str2 = str1;
assertSame(str1, str2); // 会通过,因为是同一个对象
}
@Test
@DisplayName("引用不同")
public void testNotSame() {
String str1 = "hello";
String str2 = new String("hello");
assertNotSame(str1, str2); // 会通过,虽然内容一样,但对象不同
}

⚠️ 注意:assertSame 看的是内存地址,不是内容!


4. assertTrue / assertFalse

判断布尔值。

@Test
@DisplayName("布尔断言")
public void testBoolean() {
assertTrue(2 > 1);
assertFalse(2 < 1);
}

5. assertNull / assertNotNull

判断对象是否为 null。

@Test
@DisplayName("null 断言")
public void testNull() {
String str = null;
assertNull(str);
String notNull = "abc";
assertNotNull(notNull);
}

三、数组断言:对比数组是否一致

有时候我们需要比较两个数组是否相等,这时候用 assertArrayEquals

@Test
@DisplayName("数组断言")
public void array() {
int[] arr1 = {1, 2};
int[] arr2 = {1, 2};
assertArrayEquals(arr1, arr2);
}

✅ 只要顺序和内容都一样,就会通过。

如果你改成 {2, 1},就会失败。


四、组合断言:一次性验证多个条件

有时候你想一次检查多个断言,可以用 assertAll

@Test
@DisplayName("组合断言")
public void assertAll() {
assertAll(
() -> assertEquals(2, 1 + 1),
() -> assertTrue(1 > 0),
() -> assertNotNull("hello")
);
}

优点:即使其中一个失败,其他还会继续执行(不会中断),你可以看到所有问题。

比如上面如果第一个断言失败了,后面两个也会跑完,方便调试。


五、异常断言:测试代码是否抛出预期异常

以前用 JUnit4 要测异常,得用 @RuleExpectedException,很麻烦。

现在 JUnit5 有 assertThrows,超简单!

@Test
@DisplayName("异常断言")
public void testException() {
Throwable exception = assertThrows(
ArithmeticException.class,
() -> {
int result = 10 / 0;
}
);
assertTrue(exception.getMessage().contains("/ by zero"));
}

✅ 这个测试会成功,因为我们确实抛出了 ArithmeticException

如果没抛异常,或者抛了别的异常,就会失败。


六、超时断言:防止测试卡死

有些方法可能因为网络或 IO 操作太慢,导致测试一直挂住。

我们可以设置超时时间。

@Test
@DisplayName("超时断言")
public void timeoutTest() {
Assertions.assertTimeout(Duration.ofMillis(1000), () -> {
Thread.sleep(500); // 这个不会超时
});
}

✅ 如果方法执行超过 1 秒,就会抛异常。

你可以试试把 sleep(500) 改成 sleep(1500),然后看测试失败。


七、快速失败:直接让测试失败

有时候你想手动让测试失败,比如某个条件不满足时强制失败。

fail() 方法:

@Test
@DisplayName("快速失败")
public void shouldFail() {
fail("This should fail");
}

✅ 这个测试一定会失败,并输出提示信息。

这在写测试框架或模拟某些边界情况时很有用。


八、实战案例:测试 Redis 连接

我之前遇到一个问题,测试 Redis 连接的时候,连接失败了,但测试没报错,只打印了日志。

比如这样:

@Test
@DisplayName("测试 Redis")
public void testRedis() {
try {
redisTemplate.opsForValue().get("test");
} catch (Exception e) {
System.err.println("Redis 连接失败:" + e.getMessage());
}
}

但这只是打印,测试依然通过了!

这不是我们想要的。

所以我们应该用断言来捕获异常:

@Test
@DisplayName("测试 Redis 连接异常")
public void testRedisConnection() {
assertThrows(
RedisConnectionFailureException.class,
() -> redisTemplate.opsForValue().get("test")
);
}

或者更通用一点:

@Test
@DisplayName("Redis 连接应失败")
public void testRedisFail() {
Throwable exception = assertThrows(Exception.class, () -> {
redisTemplate.opsForValue().get("test");
});
assertTrue(exception.getMessage().contains("connection"));
}

这样,一旦连接失败,测试就会明确失败,而不是默默忽略。


九、总结:断言是测试的灵魂

断言类型用途
assertEquals, assertNotEquals检查值是否相等
assertSame, assertNotSame检查引用是否相同
assertTrue, assertFalse检查布尔条件
assertNull, assertNotNull检查 null
assertArrayEquals检查数组是否相等
assertAll组合多个断言
assertThrows检查是否抛出特定异常
assertTimeout设置超时时间
fail()手动让测试失败

这些断言方法就像“裁判”,帮你判断代码行为是否符合预期。


十、写在最后

刚开始写测试时,我也只是简单地用 assertEquals,后来才慢慢发现,好的断言能让测试更清晰、更健壮

比如:

这些都是“细节控”的体现,但正是这些细节,决定了你的测试是否可靠。

所以,别小看断言,它是你代码质量的“守护神”。


附:完整测试类示例

import org.junit.jupiter.api.*;
import java.time.Duration;
class MyTests {
@Test
@DisplayName("简单断言")
public void simpleAssert() {
assertEquals(5, 2 + 3);
assertTrue(1 > 0);
assertNotNull("hello");
}
@Test
@DisplayName("异常断言")
public void exceptionAssert() {
assertThrows(ArithmeticException.class, () -> {
int x = 10 / 0;
});
}
@Test
@DisplayName("超时断言")
public void timeoutAssert() {
Assertions.assertTimeout(Duration.ofMillis(1000), () -> {
Thread.sleep(500);
});
}
@Test
@DisplayName("组合断言")
public void allAssert() {
assertAll(
() -> assertEquals(2, 1 + 1),
() -> assertTrue(true),
() -> assertNotNull("test")
);
}
}

好了,今天的分享就到这里。希望这篇“边学边写”的博客对你有帮助。如果你也在写测试,欢迎留言交流你的断言技巧!

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

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

相关文章

测试开发进阶生存指南 (第3.4周复习)

适用阶段:从“写脚本”向“构建工程”转型的关键期 核心目标:掌握算法思维,消灭“野路子”代码,具备生产环境代码的健壮性。📅 第三周:算法基础 (LeetCode 敲门砖) 面试官潜台词:“我不要求你造火箭,但你必须…

[极客大挑战 2019]BabySQL 1 WP

[极客大挑战 2019]BabySQL 1 WP 这波直接上最核心语句了,双写绕过整的有点崩…… ?username=1&password=1 uunionnion sselectelect 1,2,group_concat(table_name)ffromrom infoorrmation_schema.tables wwhereh…

pandas数据分析

pandas数据分析import pandas as pddf = pd.read_csv(Data1.csv,index_col=0)print("只显示前5行\n" + str(df.head()))print("\n" + str(df.tail()))print("基础细节\n" + str(df.desc…

2025年质量好的四川水溶肥厂家最新权威推荐排行榜

2025年质量好的四川水溶肥厂家权威推荐排行榜行业背景与市场趋势随着现代农业向高效、精准、绿色发展,水溶肥作为新型肥料的重要品类,近年来在四川乃至全国市场呈现出快速增长态势。四川省作为我国重要的农业大省,水…

2025年优秀的日式搬家公司值得信赖榜

2025年优秀的日式搬家公司值得信赖榜行业背景与市场趋势随着城市化进程的加速和居民生活水平的提升,搬家服务行业正经历着从传统粗放式向精细化、专业化方向的转型。特别是在2025年,日式搬家服务因其"无压力、无…

2025年高压电力金具厂家哪家好?五大合作案例丰富企业推荐全

在高压电力传输系统中,电力金具是保障电缆连接安全、稳定运行的神经节点,其工艺精度与技术可靠性直接关系到电网安全。面对市场上参差不齐的供应商,如何选择工艺精湛、技术强且案例丰富的高压电力金具制造厂?以下结…

2025年评价高的平焊不锈钢法兰厂家实力及用户口碑排行榜

2025年评价高的平焊不锈钢法兰厂家实力及用户口碑排行榜 行业背景与市场趋势 随着全球工业化的持续推进,不锈钢法兰作为管道连接的关键部件,在石油化工、电力、船舶制造、食品医药等领域的需求持续增长。2025年,…

2025年优质的搬家搬运公司/吊装搬运公司推荐排行榜

2025年优质的搬家搬运公司/吊装搬运公司推荐排行榜行业背景与市场趋势随着城市化进程的加快和居民生活水平的提高,搬家服务需求呈现持续增长态势。2024年数据显示,中国搬家服务市场规模已突破2000亿元,预计2025年将…

《寻找第 k 优解的几种方法》阅读笔记

from 余鼎力 2014 年的论文 1 引言 略 2 二分法求第 \(k\) 优解 2.1 第 \(k\) 优解的定义 首先有最优化问题的数学描述:定义 2.1. 最优化问题可以认为是在给定的集合上求某函数的极值。对于极小化,即求 \(\min\limit…

《浅谈信息学竞赛中数据的构造与生成》阅读笔记

from 刘一平 2023 年的论文 前言 在测试自己程序的正确性时,常用的方法有自己构造小数据和直接对拍。而在对拍或者为题目造数据的时候,数据的强度会成为一个很大的问题,强度不够可能会导致无法查出自己代码的错误或…

2025年口碑好的北京大兴离婚律师综合评价榜

2025年口碑好的北京大兴离婚律师综合评价榜 行业背景与市场趋势 近年来,随着社会经济的发展和人们法律意识的提升,离婚案件的数量呈现逐年上升的趋势。特别是在北京大兴区,由于城市化进程加快、人口流动性增强,涉…

《再谈图连通性相关算法》阅读笔记

from 虞皓翔 2021 年的论文 0 引言 图论是组合数学中一个历史悠久的分支,以图为研究对象。图的连通性是图论中基础且重要的理论,更是图论中的奠基石。 OI 种的图论主要以数据结构为主,对连通性等的考察并不多。本文…

2026高考艺术文化课辅导机构推荐:宁夏五大诚信艺考文化课培

在2026年高考艺术生文化课冲刺的关键阶段,选择一家靠谱的辅导机构直接关乎升学成败。艺术生往往面临专业集训后文化课断层、时间紧任务重、考点抓不准等痛点,急需针对性强、提分效率高的解决方案。以下结合宁夏本地及…

《网络流的一些建模方法》阅读笔记

from 姜志豪 2016 年的论文 1 引言 网络流是一种在 OI 种应用广泛的算法,常见网络流问题有最大流、最小费用最大流、上下界网络流等。网络流问题的巧妙之处一般不在于算法实现过程,而是建模的方法。本文将常见的网络…

2025年有哪些知名的四川水库大坝安全监测热门品牌榜

2025年四川水库大坝安全监测热门品牌榜:技术与服务并重的五大推荐行业背景与市场趋势随着我国水利基础设施建设的不断推进,水库大坝安全监测已成为水利工程管理中的核心环节。四川省作为我国水利资源大省,拥有众多大…

markdown 详解

Markdown 是由约翰・格鲁伯(John Gruber)与亚伦・斯沃茨(Aaron Swartz)于 2004 年设计的轻量级标记语言,核心目标是 “易读易写”—— 既可以用纯文本格式快速编写,又能通过简单标记语法转换为结构化的 HTML 等格…

2025年质量好的PC/ABS改性工程塑料/PC/PBT改性工程塑料TOP品牌厂家排行榜

2025年质量好的PC/ABS改性工程塑料/PC/PBT改性工程塑料TOP品牌厂家排行榜行业背景与市场趋势随着全球制造业向高端化、智能化方向发展,工程塑料作为关键基础材料,在汽车、电子电器、新能源等领域的应用日益广泛。PC/…

2025年知名的苏式仿古铝瓦实力厂家TOP推荐榜

2025年知名的苏式仿古铝瓦实力厂家TOP推荐榜 行业背景与市场趋势 随着中国传统建筑文化的复兴与现代建筑技术的融合,苏式仿古建筑在文旅地产、商业街区、园林景观等领域的需求持续增长。作为仿古建筑的重要材料,苏…

2025年靠谱的ENF级生态板厂家推荐及采购指南

2025年靠谱的ENF级生态板厂家推荐及采购指南行业背景与市场趋势随着消费者环保意识的不断提升和家居健康需求的日益增长,ENF级(≤0.025mg/m)生态板已成为2025年家居建材市场的热门选择。作为目前全球最严格的甲醛释…

2025年比较好的直立锁边金属屋面/铝镁锰金属屋面厂家最新推荐排行榜

2025年比较好的直立锁边金属屋面/铝镁锰金属屋面厂家推荐排行榜行业背景与市场趋势随着建筑行业对轻量化、耐久性和美观性要求的不断提高,直立锁边金属屋面和铝镁锰金属屋面系统在2025年迎来了更广阔的市场空间。这类…