讲师中心 微信公众号
AI工具推荐 视频效率加速

异常处理的单元测试:利用 JUnit 的 assertThrows 校验特定业务代码是否准确抛出了预期异常

阿杰同学_5127

阿杰同学_5127

发布时间:2026-04-30 14:27:59

|

936人浏览过

|

来源于php中文网

原创

JUnit 5 的 assertThrows 方法可验证异常类型并获取异常实例用于进一步断言,比 @Test(expected = ...) 更灵活安全;它接收异常类和Executable代码块,返回异常对象,支持消息及字段校验,且作用域精确、语义清晰。

异常处理的单元测试:利用 junit 的 assertthrows 校验特定业务代码是否准确抛出了预期异常

要验证一段业务代码是否如预期那样抛出了特定异常,JUnit 5 提供了 assertThrows 方法——它既能确认异常被抛出,又能获取异常实例用于进一步断言(比如检查异常消息、错误码等),比旧版的 @Test(expected = ...) 更灵活、更安全。

基础用法:确认异常类型被抛出

最常用场景是检查某段逻辑是否在非法输入或状态时触发了目标异常:

  • 传入一个 Class<E> 类型参数指定期望的异常类(如 IllegalArgumentException.class)
  • 第二个参数是函数式接口 Executable,封装待测的“可能抛异常”的代码块
  • 方法返回捕获到的异常对象,可用于后续校验

示例:

assertThrows(IllegalArgumentException.class, () -> userService.updateUser(null));

进阶断言:校验异常消息与字段

仅确认异常类型不够,业务中常需验证异常携带的提示信息或业务错误码是否准确。此时可先捕获异常,再对其属性做断言:

  • 将 assertThrows 的返回值赋给变量,避免重复执行被测逻辑
  • 用 assertEquals 检查 e.getMessage() 是否匹配预期文案
  • 若自定义异常含 errorCode、timestamp 等字段,可直接调用 getter 断言

示例:

IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> userService.updateUser(new User("", "123")));
assertEquals("用户名不能为空", e.getMessage());

注意边界:避免误判和空指针

assertThrows 本身不处理“未抛异常”的情况——如果代码正常执行完毕,测试会直接失败(报错 “Expected java.lang.IllegalArgumentException to be thrown”)。但有两点易被忽略:

  • 确保被测代码确实执行到了可能抛异常的路径(例如 if 分支、数据库连接失败模拟等),必要时配合 Mockito 打桩控制流程
  • 不要对返回值为 null 的异常对象做链式调用(如 e.getMessage().contains(...)),应先确认异常非 null(assertThrows 已保证不为 null,但自定义逻辑中仍需谨慎)

替代方案对比:为什么不用 @Test(expected = ...)

JUnit 4 的 @Test(expected = ...) 注解存在明显局限:

  • 只能声明异常类型,无法获取异常实例,不能校验消息或字段
  • 只要测试方法中任意位置抛出该异常即算通过,哪怕发生在断言之后或清理逻辑里,容易掩盖真实问题
  • 不支持 lambda 表达式,写法冗长,可读性差

而 assertThrows 将校验范围精确限定在你指定的代码块内,语义清晰,扩展性强,是当前推荐的标准做法。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

4230

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

2621

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

1006

2025.10.24

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

20

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

20

2026.09.30

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

20

2026.09.30

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

20

2026.09.30

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

20

2026.09.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

220

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn