Mag*_*lex 9 java testng unit-testing exception
为什么TestNG有可能检查是否抛出了几个异常中的一个?据我所知,JUnit只支持一个预期的异常.考虑以下两个测试都将通过的TestNG虚拟示例:
@Test(expectedExceptions = { NullPointerException.class, IllegalArgumentException.class })
public void throwsNullPointer() {
throw new NullPointerException();
}
@Test(expectedExceptions = { NullPointerException.class, IllegalArgumentException.class })
public void throwsIllegalArgument() {
throw new IllegalArgumentException();
}
Run Code Online (Sandbox Code Playgroud)
我最初的感觉是,应该可以从测试中的代码中精确地推导出预期的异常.但是,TestNG背后的人必须做出一些设计决定.
它是否支持测试具有无法模拟的随机功能的代码?有没有人有想法,最好是现实生活场景?
为什么 TestNG 允许几个预期的异常?
我认为最可能的原因是人们要求提供该功能……并且提供这是合理的事情。
我可以想到一些用例。
当为不确定性的代码编写测试时可能需要它,并且非确定性会影响抛出的异常。
当测试 API 的多个实现时可能需要它,这些实现对于抛出的异常可能表现不同。实现可以是不同的类或同一类的不同版本。
当测试依赖于第三方软件的代码时可能需要它,并且必须处理该软件的多个版本以及测试可见的不同行为。
当对接口规范不清楚的 API 进行“黑盒”测试时,可能需要它。
我最初的感觉是,应该可以从被测试的代码中准确地得出预期的异常。
这假设您有权访问源代码。此外,根据代码调整测试忽略了您应该根据规范而不是代码进行测试的这一点。
如果您可以选择允许多个例外,则可以避免这种情况。(并且您没有此选项,那么您(测试编写者)必须捕获并测试测试用例中的异常......如果可能存在多个异常。)
代码能够抛出多种类型的异常并不罕见,这也是为什么可以在一条catch语句中折叠此类异常的原因之一:
catch(IOException | InterruptedException ex) {
Run Code Online (Sandbox Code Playgroud)
因此,我觉得允许expectedExceptions多个例外是很自然的。
老实说,我不经常使用它,它使我稍后添加的一个功能变得复杂,该功能可以让您测试异常消息是否与常规异常匹配。如果我可以重做的话,这可能是我会以不同方式实现的功能之一。