java - JUnit 4 和异常暂停

标签 java debugging reflection exception-handling junit

当我的代码中抛出一个未捕获的异常时,我习惯于让调试器在抛出语句处停止,这样我就可以检查抛出异常时涉及的局部变量和所有对象的成员。使用 IntelliJ Idea,这可以通过转到运行查看断点、选择异常断点选项卡、检查任何异常,并确保未选中捕获异常 复选框,同时选中未捕获异常 复选框。对于 EclipseVisual Studio(针对 C#),情况有所不同,但思路相同。

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

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

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

那么,有没有其他人遇到同样的问题?有谁知道解决方案,以便我们可以在使用 JUnit 进行测试时让调试器在出现意外异常时暂停程序执行?

相关(未回答)问题:Suspend on uncaught runtime exceptions in Eclipse Junit test runner

相关(未回答)问题:How to break into debugger within a jUnit test case?

相关(部分回答)问题:Break on Exception in Eclipse using jUnit (公认的答案是“如果您在 jUnit 中调试单个方法,断点就会开始工作。如果在 jUnit 中调试整个类或包,调试器将不起作用。”)

最佳答案

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

  • 你有一个测试,它抛出一个你自己没有捕获的异常(所以从这个意义上说,它是未捕获的)
  • 当您使用 JUnit4 测试运行器调试此测试时,JUnit 会向您显示测试失败(它引发了异常)
  • 但是线程并没有被挂起,这就是你想要达到的效果
  • 即使您有偏好| Java |调试 |暂停执行未捕获的异常 已启用

在那种情况下,我相信这是预期的行为,JUnit 捕获并吞下您的异常,因此就 eclipse 而言,它不会未被捕获,如此处所述 https://bugs.eclipse.org/bugs/show_bug.cgi?id=414133

您可以通过设置您自己的规则来暂停捕捉到的异常,以任何方式暂停 eclipse。 调试视角 |断点 View |杰!图标 |检查在捕获异常时挂起

关于java - JUnit 4 和异常暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13611711/

相关文章:

generics - 在 Go 中实现通用映射器的惯用方法

Java 7 和反射 - 它会 self 优化吗?

java - 使用套接字编程连接到我的家庭服务器

java - 仅使用单个一维数组将数组循环左移 n 个位置的有效方法。

java - 在 AspectJ 中禁用/避免建议执行

java - 从 stdin 读取多字字符串

ios - 生成错误 : "Unknown type name ' ffi_cif'"

debugging - gdb - 中断静态函数

c++ - gradle请参阅model.components.binaries.all的输出

go - DeepEqual []接口(interface){}