为什么TestNG允许多个预期的例外?

时间:2015-06-03 16:40:37

标签: java unit-testing exception testng

为什么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背后的人必须做出一些设计决定。

它是否支持测试具有无法模拟的随机功能的代码?有没有人有想法,最好是现实生活场景?

2 个答案:

答案 0 :(得分:4)

  

为什么TestNG允许多个预期的例外?

我认为最可能的原因是人们要求提供这项功能......这是合情合理的。

我可以想到一些用例。

  • 在编写非确定性代码的测试时可能需要它,而非确定性会影响抛出的异常。

  • 在测试API的多个实现时可能需要这些实现可能与抛出异常的行为不同。实现可以是不同的类或同一类的不同版本。

  • 在测试依赖于第三方软件的代码时可能需要它,并且必须处理具有测试可见的不同行为的该软件的多个版本。

  • 在对接口规范不明确的API进行“黑匣子”测试时可能需要它。

  

我最初的感觉是,应该可以从测试中的代码中精确地推导出预期的异常。

假设您有权访问源代码。此外,使测试适应代码是缺少您应该针对规范而不是代码进行测试的重点。

如果您可以选择允许多个例外,则可以避免这种情况。 (并且您没有此选项,那么您(测试编写者)必须捕获并测试测试用例中的异常...如果可能存在多个异常。)

答案 1 :(得分:4)

代码能够抛出几种类型的异常并不罕见,这也是为什么可以在一个catch语句中崩溃这些异常的原因之一:

catch(IOException | InterruptedException ex) {

因此,我很自然地允许expectedExceptions允许多个例外。

说实话,我不经常使用它,并且它使我稍后添加的功能变得复杂,这使您可以测试异常消息是否与常规异常匹配。如果我可以重做它,我可能会以不同的方式实现这些功能之一。