当我的代码中抛出一个未捕获的异常时,我习惯于让调试器在throwing语句处停止,以便我可以检查本地变量以及所涉及的所有对象的成员抛出异常的时刻。随着IntelliJ IDEA的这可以通过将运行,查看断点,选择异常实现断点选项卡,检查任何异常,并确保该捕捉到异常复选框是选中,而未捕获的异常复选框被选中。使用Eclipse和Visual Studio(对于C#),它有些不同,但沿着相同的路线。JUnit 4和异常挂起
使调试器以这种方式工作的能力非常有用;实际上非常有用,我相应地构建了我的程序的主循环:在发行版本上,主循环当然嵌入了try-catch-all;但在调试版本中,主循环中没有try-catch块,所以任何在程序中任何地方都没有捕获到的异常都将保持未捕获状态,这样调试器就会在抛出时暂停我的程序。但是,当使用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中调试完毕,调试器将不起作用“)
您运行的是哪个版本的JUnit?我可以在我的测试中捕获未捕获的异常,Eclipse Indigo Build 20110615-0604,JUnit 4. – Perception
我正在使用JUnit 4.8.1。请注意,这个问题不是捕捉未捕获的异常;这是关于让调试器暂停未捕获异常的程序执行。换句话说,如果抛出的异常是未捕获的,那么它的作用就像是一个断点。 –
我想我不清楚。我的IDE(Eclipse Indigo)会自动暂停执行,如果我也告诉它,捕获/未捕获的异常。即使在运行JUnit 4测试时也是如此。 – Perception