原文地址: 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是否符合预期。