在JUnit测试中抛出所有异常是不好的做法吗?

cod*_*leb 7 java junit unit-testing junit4

而不是在我的JUnit测试中进行异常处理,我只是声明我的测试方法... throws Exception

我开始这样做,我没有看到为什么我应该更具体的原因.

Gho*_*ica 12

单元测试的核心方面是帮助您尽快隔离/解决生产代码中的错误.

从这个意义上讲:你不会编写@Test方法以便被其他方法调用.您编写它们以便JUnit框架运行它们.

通常,当该测试抛出异常时; 抓住它是没有意义的(除非预期;并且你想进一步检查该异常).

因此:没有捕获块; 而且在99.999%的情况下,将测试方法签名的潜在投掷原因添加为正确答案.或者100%; 因为我找不到一个好的反例.

但是我会谨慎地使用throws Exception快速.您仍然希望您的代码尽可能"具体"; 所以最好去throws ThatExceptionThatCanReallyBeThrown.当这个列表过于频繁地增长时......那么你最好跟进那一侧并检查你的生产代码中的抛出列表是否应该以某种方式"削减".

编辑:可能需要理解的核心事项是:对于每一项任何测试,您都会对将要发生的事情有一个确切的期望.该方法应该:

  1. 不要抛出异常
  2. 抛出一个特定的例外(然后你会做的@Test(expected=...)事情
  3. 抛出一个特定的异常...您的测试需要捕获以进一步检查
  4. 抛出一个异常......这将表明一个真正的"错误"状态(因为你没想到它会发生); 在这种情况下,JUnit将捕获异常并将其作为失败的测试用例报告给您.(但是,当然,请记住,JUnit中的测试用例错误和测试失败存在细微差别).

只是加上throws X, Y你的测试方法签名是解决子弹2和4的直接方法.

  • 我想:当你期望发生一些异常并且你需要进一步检查被捕获的异常对象的属性时,就会出现这种情况.否则,你实际上只是在你的方法上放置`@Test(expected = Whatever.class)`并且在你的抛出列表中有什么. (2认同)
  • 我的一些同事倾向于使用“抛出异常”而不是“抛出ThisExceprtion、ThatException、TheOtherException”,因此当生产代码发生变化时,他们不必更改 throws 子句。虽然我更喜欢更具体的内容,但我很难真正责怪他们。 (2认同)