为什么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();
}
我最初的感觉是,应该可以从测试中的代码中精确地推导出预期的异常。但是,TestNG背后的人必须做出一些设计决定。
它是否支持测试具有无法模拟的随机功能的代码?有没有人有想法,最好是现实生活场景?
答案 0 :(得分:4)
为什么TestNG允许多个预期的例外?
我认为最可能的原因是人们要求提供这项功能......这是合情合理的。
我可以想到一些用例。
在编写非确定性代码的测试时可能需要它,而非确定性会影响抛出的异常。
在测试API的多个实现时可能需要这些实现可能与抛出异常的行为不同。实现可以是不同的类或同一类的不同版本。
在测试依赖于第三方软件的代码时可能需要它,并且必须处理具有测试可见的不同行为的该软件的多个版本。
在对接口规范不明确的API进行“黑匣子”测试时可能需要它。
我最初的感觉是,应该可以从测试中的代码中精确地推导出预期的异常。
假设您有权访问源代码。此外,使测试适应代码是缺少您应该针对规范而不是代码进行测试的重点。
如果您可以选择允许多个例外,则可以避免这种情况。 (并且您没有此选项,那么您(测试编写者)必须捕获并测试测试用例中的异常...如果可能存在多个异常。)
答案 1 :(得分:4)
代码能够抛出几种类型的异常并不罕见,这也是为什么可以在一个catch
语句中崩溃这些异常的原因之一:
catch(IOException | InterruptedException ex) {
因此,我很自然地允许expectedExceptions
允许多个例外。
说实话,我不经常使用它,并且它使我稍后添加的功能变得复杂,这使您可以测试异常消息是否与常规异常匹配。如果我可以重做它,我可能会以不同的方式实现这些功能之一。