JUnit 4和Suspend-on-Exception

当我的代码中抛出未捕获的exception时,我习惯让调试器停止在throw语句中,这样我就可以检查局部变量以及抛出exception时所涉及的所有对象的成员。 使用IntelliJ Idea,可以通过转到“运行” ,“ 查看断点” ,选择“ exception断点”选项卡,选中“ 任何exception ”并确保未选中“ 捕获exception”复选框,同时选中“ 未捕获exception”复选框来完成此操作。 使用EclipseVisual Studio (对于C#),它是不同的,但是沿着相同的路线。

使调试器以这种方式运行的能力非常有用; 实际上非常有用,我相应地构建了我的程序的主循环:在发布版本中,主循环当然嵌入在try-catch-all中; 但是在调试版本中,主循环中没有try-catch块,因此在程序中任何地方都没有捕获的任何exception都将保持未被捕获状态,因此调试器将在抛出它们时暂停我的程序。

但是,在使用JUnit测试我的Java类时,我遇到了一个问题:调试器不会停止任何exception。 相反,会发生的事情是,不仅预期的,而且意外的exception也会被自动捕获,并且我会获得一个事后exception堆栈跟踪以尝试理解。 那不是很酷。

我曾经认为这种情况正在发生,因为JUnit使用java.lang.reflect.Method.invoke() ,它捕获所有exception并将它们转换为TargetInvocationExceptions ,但后来我编写了自己的自定义JUnit运行器,它知道我的测试类个人直接调用其方法而不使用Method.invoke() ,问题仍然存在。 这意味着问题出现在核心JUnit中。

那么,其他人是否也有同样的问题? 有没有人知道一个解决方案,以便我们可以让调试器在使用JUnit进行测试时暂停程序执行意外exception?

相关(未回答)问题: 在Eclipse Junit测试运行器中暂停未捕获的运行时exception

相关(未答复)的问题: 如何在jUnit测试用例中进入调试器?

相关(部分回答)问题: 使用jUnit打破Eclipse中的exception (接受的答案说“如果你在jUnit中调试单个方法,断点就会开始工作。如果在jUnit中调试整个类或包,调试器不会不行。“)

我希望我能正确理解这个问题,如果我错了,请纠正我,但是:

  • 你有一个测试,它抛出一个exception,你没有抓住自己(因此,从这个意义上讲,它是未被捕获的)
  • 当您使用JUnit4 testrunner调试此测试时,JUnit会向您显示测试失败(它抛出了exception)
  • 但线程没有暂停,这是你想要实现的
  • 即使你有preferences | java | debug | suspend execution on uncaught exceptions preferences | java | debug | suspend execution on uncaught exceptions preferences | java | debug | suspend execution on uncaught exceptions启用的preferences | java | debug | suspend execution on uncaught exceptions

在这种情况下,我相信这是预期的行为,JUnit捕获并吞下你的exception,所以就eclipse来说它并没有被捕获,如此处所述https://bugs.eclipse.org/bugs/show_bug.cgi? ID = 414133

您可以通过设置自己的规则来暂停捕获的exception,从而以任何方式暂停eclipse。 Debug perspective | breakpoint view | J! icon | check suspend on caught exception

作为调查测试失败时使用的一种解决方法,您可以在main方法中创建一个违规测试类的实例,并使用您的exception断点方法手动调用其测试方法(顺便说一句,这非常酷,谢谢问题) 。 这样,该方法不会被reflection地调用。