You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit单元测试@Test(expected)无法捕获自定义异常问题

问题根本原因

JUnit的@Test(expected = xxx.class)校验逻辑,只会检测测试方法执行过程中向上抛出到框架层的指定类型异常。你封装的testCase()方法里写了全量捕获Exception的try-catch块,Validate()抛出的NullStudentObjectException被你自己的代码捕获后,仅打印了栈追踪就直接终止了异常传播,根本没有抛到JUnit框架层,自然无法被识别。
你测试JDK内置除零异常时能正常捕获,本质是当时的测试代码没有额外写catch块吞异常,异常可以正常传递到JUnit层。

你的代码中还存在其他会导致编译失败的错误
  • Validate方法中else if(obj.getMarks() == null语句缺少右括号
  • Validate方法中return(findGrades(obj);语句缺少右括号,正确写法为return findGrades(obj);
  • 实例化对象时拼写错误:new StudnetReport()应为new StudentReport()
  • 需确认三个自定义异常类的继承关系正确:如果是受检异常需继承Exception,非受检异常需继承RuntimeException
修复方案

二选一即可:

  1. 去掉吞异常的冗余封装,直接在测试方法中调用目标校验逻辑,让异常直接抛给JUnit:
@Test(expected = NullStudentObjectException.class)
public void testNullStudentInput() {
    StudentReport objSR = new StudentReport();
    // 直接传入null参数调用校验方法
    objSR.Validate(null);
}
  1. 如果必须保留testCase()这层封装,需要在catch块处理完日志后把异常重新向上抛出,保证异常能传递到JUnit层:
// 方法签名要声明抛出对应异常
public void testCase() throws NullStudentObjectException, NullNameException, NullMarksArrayException {
    StudentReport objSR = new StudentReport();
    try {
        objSR.Validate(data[6]);
    } catch (Exception e) {
        e.printStackTrace();
        // 关键:重新抛出捕获到的异常,不要吞掉
        throw e;
    }
}

内容的提问来源于stack exchange,提问作者the_razz03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 04:39:58