【问题标题】:Assert System.out/err in testcase在测试用例中断言 System.out/err
【发布时间】:2021-10-04 06:19:55
【问题描述】:

我正在考虑通过创建扩展将旧的 junit4 扩展移植到 junit5。到目前为止,我失败的一个功能是使任何写入 System.out 或 System.err 的测试方法失败,并让失败点指向该特定测试。

我尝试将 TestExecutionListener#reportingEntryPublished 与 junit.jupiter.extensions.autodetection.enabled=true 一起使用,并且我使用了该方法,但是此时实际上将测试状态更改为 FAILED 为时已晚。或者我可以吗?

我开始使用 BeforeAllCallback 和 AfterAllCallback 并进行 out/err 重定向,并改为在字符串缓冲区上断言。我可能能够让它工作,但这似乎是我可能会在几年后搞砸并发现错误的事情:) 我们的 junit4 跑步者做了类似的事情,但它真的过于复杂了,我不希望任何人尝试维护类似的东西。

在junit5中有什么方法可以很好地做到这一点?

【问题讨论】:

  • 看看github.com/stefanbirkner/system-lambda。如果您想自己重新实现其部分功能,请查看代码。
  • 谢谢。这看起来具有相同类型的功能,但如果我正确阅读它,那么我必须将它添加到每个测试方法中。我希望它自动断言它运行的所有测试,而无需向 6000 多个测试用例中的每一个添加代码。或者我可以用系统 lambda 来完成这个吗?
  • 您可以使用此处描述的全局扩展注册:junit.org/junit5/docs/current/user-guide/…
  • 再次感谢您的回答。我在这里的吸收有点慢,你是说我应该创建一个调用 SystemLambda 上的方法的 BeforeEachCallback/AfterEachCallback 类吗?也就是说,我已经设法获得了自己的自动注册扩展,所以我已经有了,我只是还没弄清楚如何在其中使用 system-lambda。
  • 我想我已经成功了,但很遗憾,我无法重用 system-lambda。如果我知道怎么做,我会接受你的回答:)

标签: junit5 junit5-extension-model


【解决方案1】:

我最终做的是创建一个实现 BeforeEachCallback、AfterEachCallback 的类,并将 beforeEach 期间的每个 stderr/out 重定向到一个自定义打印流,每个打印流存储所有接收到的输出。然后在 afterEach 期间,我询问打印流是否收到任何东西。如果有,那么我抛出自定义流根据第一次打印调用时修改的堆栈跟踪生成的 AssertionError。然后将 out/err 重置为原始流。 这允许一些技巧允许将输出打印到控制台而不会引发错误,并且仍然将测试用例标记为失败,并带有关于禁止输出的自定义消息。

此解决方案存在一些潜在的缺陷,例如我尝试调用 Logger 的其他扩展类之一中的错误会产生一些可疑的情况。对于我们的用例,应该足够了。

由于我的雇主有很多障碍要通过才能被允许在外部共享代码,很遗憾我无法为其他需要做同样事情的人这样做,但应该能够弄清楚如何照着上面的做就行了。

【讨论】:

  • 为什么不将答案作为更新添加到您的问题中。一些代码会有所帮助。
  • 如上所述,由于公司霸主,我无法共享代码。
猜你喜欢
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 2014-10-21
  • 1970-01-01
相关资源
最近更新 更多