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
修复方案
二选一即可:
- 去掉吞异常的冗余封装,直接在测试方法中调用目标校验逻辑,让异常直接抛给JUnit:
@Test(expected = NullStudentObjectException.class) public void testNullStudentInput() { StudentReport objSR = new StudentReport(); // 直接传入null参数调用校验方法 objSR.Validate(null); }
- 如果必须保留
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
相关产品推荐
相关产品推荐

