在大多数 JUnit 测试中抛出异常是否违反最佳实践?

2022-08-31 22:31:26

几乎所有的 JUnit 测试都是使用以下签名编写的:

public void testSomething() throws Exception

我的理由是,我可以专注于我正在测试的内容,而不是JUnit免费提供给我的异常处理。但是,这样做会遗漏任何东西吗?这是否违背了最佳实践?通过显式捕获测试中的特定异常,然后在测试中失败()它们,我会获得任何东西吗?


答案 1

通常,如果您正在测试一个不希望发生异常的情况,那么我只会让测试方法抛出异常,正如您所说明的那样,因为它可以很好地区分失败测试用例(它们不通过您的任何一个断言)和错误测试用例(它们会导致意外异常)。JUnit TestRunners将捕获抛出的异常,因此您不必担心在抛出异常时整个测试套件都会挽救。

另一方面,如果您正在编写一个应该触发异常的测试,那么您要么希望使用JUnit 4注释的变体,要么使用更常见的JUnit 3习语:@Test(expected=IllegalArgumentException.class)

try {
  target.someMethodToTest();
  fail("Should have gotten an exception");
} catch (IllegalStateException ise) {
  //expected, it's all good
}

答案 2

不要抓住并失败 - 你会失去有价值的信息。让所有异常都飞起来。这意味着您需要添加可以引发的每个已检查异常的签名。但是,我建议你不要采取懒惰的方式,盲目地习惯使用。这使您不必考虑您的API在异常方面的实际行为。throws Exception


推荐