assertthrows可直接测试方法是否抛出指定异常,支持获取异常实例校验类型、消息、业务字段等;需用lambda避免提前执行,受检异常需转换,不抛异常时应使用assertdoesnotthrow。

直接用 assertThrows 就能测试方法是否抛出指定异常,它会执行代码、捕获异常、返回实例,一步到位。
基础用法:确认是否抛出目标异常类型
传入期望的异常类和一个 Lambda 表达式,如果方法没抛该异常(或根本没抛异常),测试立刻失败:
- ✅ 正确写法:
assertThrows(NullPointerException.class, () -> obj.toString()) - ❌ 错误写法:
assertThrows(NullPointerException.class, obj.toString())—— 方法立即执行,异常无法被捕获 - 返回值可赋给变量,比如
NullPointerException e = assertThrows(...),后续还能校验细节
校验异常消息:不只是“有没有”,还要“对不对”
只断言类型容易误判(比如多个地方都抛 IllegalArgumentException),建议紧接着验证消息内容:
- 用
e.getMessage()获取消息字符串 - 推荐
assertEquals("预期文案", e.getMessage()),避免空格、大小写等细微差异 - 若消息含动态值(如数字、字段名),可用
assertTrue(e.getMessage().contains("xxx"))或正则匹配
处理自定义异常:连 errorCode、cause 都能一起断言
如果你的自定义异常有业务字段(比如 getErrorCode()、getHttpStatus()、getCause()),可以直接调用并断言:
assertEquals("ERR_002", e.getErrorCode())assertTrue(e.getCause() instanceof IOException)- 确保构造器逻辑完整,比如带 message 和 cause 的重载是否正确传递了参数
注意几个关键避坑点
- Lambda 内不要加
try-catch,否则异常被吞掉,assertThrows拿不到 - 受检异常(如
IOException)不能直接在 Lambda 中抛出,需用try-catch包裹后转为运行时异常再抛 - 要验证“不抛异常”,别用
assertThrows,改用assertDoesNotThrow(() -> ...)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











