[英]Junit Eclipse - No stack trace on success when exception is expected
我有使用 @Test(expected=) 语法的 junit 测试。 当我运行这些测试时,会生成异常并且测试通过,但异常的堆栈跟踪仍记录在控制台中。
这是令人困惑的,因为没有迹象表明哪个测试生成了什么消息。 我有很多测试,我不知道这些堆栈跟踪是否只是预期的异常,或者测试中存在一些问题。
如果测试成功,有没有办法阻止期望从日志中抛出异常的测试?
是的。 不要记录它们。 这不是 JUnit 打印那些东西。 是你,在你自己的(非测试)代码中。 JUnit 不能神奇地潜入那里,找出您编写的代码明确告诉 VM 无缘无故地打印跟踪,并以某种方式抑制它。
这不是你的错,而是......大量的教程,甚至在这里,答案,以及导致你走上这条道路的疯狂 IDE 默认设置。
所以,修复它! 这不是太难; 启动 IDE 的全局搜索工具并寻找e.printStackTrace()
。 将它们全部消除。 现在是狩猎季节。
那么,你会怎么做呢? 几个步骤:
首先要做的事情是:输入您的 IDE 设置并在使用“添加 try/catch”的快速修复时修复模板。 catch 块应该是throw new RuntimeException("uncaught", e);
,而不是e.printStackTrace()
。
任何时候一个方法的本质固有地暗示它会抛出一个特定的检查异常,让它这样做。 一个不throws IOException
名为openFile
的方法写得不好。 让它抛出那个,然后消除try/catch(Exception e) {e.printStackTrace();}
,我们以后将其命名为“渡渡鸟模式”。 这应该摆脱大约一半的人。
接下来是您使用 dodo 模式“修复”的已检查异常并不是方法本质的固有部分。 例如,假设您编写了一个游戏保存系统,并且您当前的实现通过将其写入数据库来工作,并且您对SQLException
进行了 dodo 模式。 保存游戏本身并不意味着数据库交互,因此编写public void saveGame() throws SQLException
不一定是好的设计。 几乎所有此类情况的解决方案是将异常重新包装为其他内容。 例如,创建一个SaveException
类。 确保它具有接受消息和原因的构造函数。 然后:
} catch (SQLException e) {
throw new SaveException("Cannot save game", e);
}
保持消息简短,甜蜜,不要添加多余的信息(如果您的消息涉及“出现问题”-您做错了。这是一个最终未被发现的例外。暗示出了问题,无需说它)。 并且绝对不要添加感叹号。
有时你不需要例外,可以重新包装成更有用的东西。
RuntimeException
或其他一些简单的东西中,或者使用@SneakyThrows
的@SneakyThrows
来实现这些。 这应该让您摆脱每一个讨厌的.printStackTrace()
调用。 一旦你这样做了,你的问题就会消失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.