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

阿杰同学_5127

阿杰同学_5127

2026-04-30

936人浏览

原创

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

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

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

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

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

  • 传入一个 Class 类型参数指定期望的异常类(如 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 将校验范围精确限定在你指定的代码块内,语义清晰,扩展性强,是当前推荐的标准做法。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

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

相关专题

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

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

2023.10.13

5290

8

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

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

2023.10.23

3681

10

Java 单元测试
Java 单元测试

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

2025.10.24

1246

26

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

100

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

60

15

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

2026.11.12

60

15

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

160

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

120

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

120

10

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.3万人学习