原文地址: https://www.baeldung.com/junit-assert-exception
在单测中,对于一些异常的处理方式有哪些支持呢,如何用简单的方式判断当前的异常是符合预期的。
JUint5
JUnit5提供了assertThrows
方法来断言异常。同时它允许通过lambda表达式传递被测代码。
@Test
public void whenExceptionThrown_thenAssertionSucceeds(){
String test = null;
assertThrows(NullPointerException.class, () -> {
test.length();
})
}
这个可以满足在封闭的代码中抛出类型为NullPointerException或者其任何派生类型的异常时,都可以被断言。
就意味着,如果我们期望是Exception
类型,任何异常抛出都会被断言。
如果上面的代码,修改成期望RuntimeExcetion
,这个单测也是可以通过的。
用assertThrows()
方法,可以更精细化控制异常断言逻辑,因为我们可以用它包含代码的具体部分。
JUnit4
在JUnit4中,我们可以简单地使用@Test
注解的expected
属性,来定义我们希望的被抛出的异常。
但是是监控整个测试方法。
如果单测执行时,没有抛出异常会失败。只有抛出了才会通过。
@Test(expected = NullPointerException.class)
public void whenExceptionThrown_thenExpectationSatisfied(){
String test = null;
test.length();
}
当我们需要确认一些异常的其他属性时,我们可以使用ExpectedException
规则。
@Rule
public ExpectedException exceptionRule = ExpectedException.none();
@Test
public void whenExceptionThrown_thenRuleIsApplied() {
exceptionRule.expect(NumberFormatException.class);
exceptionRule.expectMessage("For input string");
Integer.parseInt("1a");
}
上面代码中,先定义了ExpectedException
规则,然后,断言代码会在分析Integer
值时将会抛出带着错误消息的NumberFormatException
。
总结
最后在实际使用中,使用ExceptedException
来实现对于异常的断言,可以精确到Message是否符合预期。