Junit Eclipse - 预期异常时没有成功的堆栈跟踪

Junit Eclipse - No stack trace on success when exception is expected

我有使用 @Test(expected=) 语法的 junit 测试。 当我 运行 这些测试时,会生成异常并且测试通过,但异常的堆栈跟踪仍记录在控制台中。

这令人困惑,因为没有指示哪个测试生成了什么消息。 我有很多测试,我不知道这些堆栈跟踪是否只是预期的异常,或者测试中存在一些问题。

如果测试成功,是否有办法阻止预期抛出异常的测试被记录?

是的。不要记录它们。打印那些东西的不是 JUnit。是你,在你自己的(非测试)代码中。 JUnit 不能神奇地潜入其中,弄清楚你编写的代码明确告诉 VM 无缘无故地打印跟踪,并以某种方式抑制它。

这不是你的错,这是..大量的教程,甚至这里的 SO、答案以及疯狂的 IDE 默认值导致你走上这条路。

所以,修复它!这并不难;启动 IDE 的全局搜索工具,去寻找 e.printStackTrace()全部消灭。现在是狩猎季节。

那么,你会怎么做呢?几个步骤:

  1. 首先要做的事情是:输入您的 IDE 设置并在使用 'add try/catch' 的快速修复时修复模板。 catch 块应该是 throw new RuntimeException("uncaught", e);,而不是 e.printStackTrace().

  2. 只要方法的本质暗示它会抛出某个已检查的异常,就让它这样做。名为 openFile 的方法 而不是 throws IOException 只是写得很糟糕。让它抛出那个,然后删除我们以后将命名为 'the dodo pattern' 的 try/catch(Exception e) {e.printStackTrace();}。这应该可以消除大约一半。

  3. 接下来是使用 dodo 模式 'fixed' 检查的异常本质上不是方法的一部分的地方。例如,假设您编写了一个游戏保存系统,并且您当前的实现是通过将其写入数据库来工作的,并且您对 SQLException 进行了渡渡鸟模式。保存游戏本身并不意味着 DB 交互,所以写 public void saveGame() throws SQLException 不一定是好的设计。几乎所有此类情况的解决方案都是将异常重新包装成其他东西。例如,制作一个 SaveException class。确保它具有接受消息 原因的构造函数。那么:

} catch (SQLException e) {
  throw new SaveException("Cannot save game", e);
}

保持消息简短,温馨,不要添加多余的信息(如果您的消息涉及“出了点问题” - 你做错了。这是一个最终未被捕获的异常。暗示出了什么问题,就不用说了)。绝对不要加感叹号。

有时您不需要例外,可以重新包装成更有用的东西。

  1. 这留下了您仍然怀疑是否真的会发生的已检查异常。也将它们重新包装成 RuntimeException 或其他一些简单的东西,或者使用 lombok 的 @SneakyThrows

这应该可以让您摆脱每一个讨厌的 .printStackTrace() 电话。一旦你这样做了,你的问题就会消失。