在大多数 JUnit 测试中抛出异常是否违反最佳实践?
2022-08-31 22:31:26
几乎所有的 JUnit 测试都是使用以下签名编写的:
public void testSomething() throws Exception
我的理由是,我可以专注于我正在测试的内容,而不是JUnit免费提供给我的异常处理。但是,这样做会遗漏任何东西吗?这是否违背了最佳实践?通过显式捕获测试中的特定异常,然后在测试中失败()它们,我会获得任何东西吗?
几乎所有的 JUnit 测试都是使用以下签名编写的:
public void testSomething() throws Exception
我的理由是,我可以专注于我正在测试的内容,而不是JUnit免费提供给我的异常处理。但是,这样做会遗漏任何东西吗?这是否违背了最佳实践?通过显式捕获测试中的特定异常,然后在测试中失败()它们,我会获得任何东西吗?
通常,如果您正在测试一个不希望发生异常的情况,那么我只会让测试方法抛出异常,正如您所说明的那样,因为它可以很好地区分失败测试用例(它们不通过您的任何一个断言)和错误测试用例(它们会导致意外异常)。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
}
不要抓住并失败 - 你会失去有价值的信息。让所有异常都飞起来。这意味着您需要添加可以引发的每个已检查异常的签名。但是,我建议你不要采取懒惰的方式,盲目地习惯使用。这使您不必考虑您的API在异常方面的实际行为。throws Exception