如何测试Java方法不抛出指定类型异常?JUnit相关用法咨询
JUnit
assertDoesNotThrow() 设计逻辑及自定义验证方案 为什么assertDoesNotThrow()不支持指定异常类型
这是JUnit团队为了保持API语义单一性做的设计:
assertThrows()的核心作用是正向匹配预期异常:你明确知道代码执行时应该抛出某类特定异常,所以指定类型做精准校验,只要抛出的异常类型不匹配就判定测试失败,语义非常清晰。- 如果给
assertDoesNotThrow()增加指定异常类型的参数,会直接导致语义歧义:比如你指定不抛ParseException,那代码运行时抛出NullPointerException算不算测试通过?不同用户对这个场景的预期完全不同,不符合JUnit API「语义明确、无歧义」的设计原则,所以原生没有提供这个参数。
验证代码不抛出指定类型异常的实现方案
你可以通过手动捕获目标异常的方式实现需求,逻辑清晰没有额外依赖,示例如下:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.fail; import java.text.ParseException; import java.text.SimpleDateFormat; public class ParseTest { @Test void testInputNotThrowParseException() { String testInput = "hello"; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { // 执行你要测试的代码 dateFormat.parse(testInput); } catch (ParseException e) { // 只要捕获到目标异常就直接标记测试失败 fail("代码执行时抛出了预期外的ParseException", e); } // 其他类型的异常会直接向上抛出,遵循默认的单测异常处理逻辑 } }
这个实现完全符合需求:只有当代码抛出ParseException时才会触发自定义的失败断言,其他异常会正常终止测试并标记为失败,和普通单测的运行逻辑一致。
内容的提问来源于stack exchange,提问作者Bloop
相关产品推荐
相关产品推荐

