Wenn eine nicht abgefangene Ausnahme in meinem Code ausgelöst wird, bin ich es gewohnt, den Debugger bei der Anweisung werfen zu lassen, so dass ich die lokalen Variablen und die Mitglieder aller beteiligten Objekte untersuchen kann Moment, dass die Ausnahme ausgelöst wurde. Mit IntelliJ Idea dies kann, Ansicht Haltepunkte, die Auswahl der Ausnahme, indem Sie auf Run erreicht werden Haltepunkte Registerkarte Überprüfung Jede Ausnahme, und sicherstellen, dass die Exception abgefangen Checkbox deaktiviert ist, während die Nicht abgefangene Ausnahme Kontrollkästchen ist aktiviert. Mit Eclipse und mit Visual Studio (für C#) ist es etwas anderes, aber in gleicher Weise.JUnit 4 und Suspend-on-Exception
Die Fähigkeit, den Debugger auf diese Weise zu verhalten, ist äußerst nützlich. so nützlich in der Tat, dass ich die Hauptschleife meiner Programme entsprechend strukturiere: In der Release-Version ist die Hauptschleife natürlich in einen try-catch-all eingebettet; Aber in der Debug-Version gibt es keinen try-catch-Block in der Hauptschleife, so dass alle Ausnahmen, die nirgends in meinem Programm abgefangen werden, nicht abgefangen werden, so dass der Debugger mein Programm in dem Moment, in dem sie ausgelöst werden, aussetzt.
Beim Testen meiner Java-Klassen mit JUnit habe ich jedoch ein Problem: Der Debugger stoppt bei keiner Ausnahme. Was passiert, ist, dass nicht nur erwartete, sondern auch unerwartete Ausnahmen automatisch abgefangen werden und dass mir eine Post-Mortem-Ausnahme-Stack-Ablaufverfolgung gegeben wird, um zu versuchen, Sinn zu machen. Das ist nicht sehr cool.
Früher dachte ich, dass dies geschieht, weil JUnit Verwendung von java.lang.reflect.Method.invoke()
macht, der alle Ausnahmen abfängt und transformiert sie in TargetInvocationExceptions
, aber dann meine eigene benutzerdefinierte JUnit runner ich schrieb, die persönlich meine Testklasse kennt und ruft direkt ihre Methoden ohne Method.invoke()
, und das Problem besteht fort. Dies bedeutet, dass das Problem innerhalb von Core JUnit weit oben liegt.
Also, hat jemand anderes das gleiche Problem? Kennt jemand eine Lösung, damit der Debugger die Programmausführung bei unerwarteten Ausnahmen anhalten kann, während er mit JUnit testet?
Verwandte (offen) Frage: Suspend on uncaught runtime exceptions in Eclipse Junit test runner
Verwandte (offen) Frage: How to break into debugger within a jUnit test case?
Verwandte (teilweise beantwortet) Frage: Break on Exception in Eclipse using jUnit (Die akzeptierte Antwort sagt, dass „wenn Sie Debug für eine einzelne Methode in jUnit, Die Breakpoints beginnen zu arbeiten. Wenn eine ganze Klasse oder ein ganzes Paket in jUnit debuggt wird, funktioniert der Debugger nicht. ")
In welcher Version von JUnit laufen Sie? Ich kann nicht abgefangene Ausnahmen in meinen Tests gut fangen, Eclipse Indigo Build 20110615-0604, JUnit 4. – Perception
Ich benutze JUnit 4.8.1. Bitte beachten Sie, dass es bei dieser Frage nicht darum geht, nicht abgefangene Ausnahmen zu erfassen. Es geht darum, dass der Debugger die Programmausführung bei nicht abgefangenen Ausnahmen anhält. Mit anderen Worten, es geht darum, dass sich die Anweisung "throw" wie ein Breakpoint verhält, wenn die geworfene Exception nicht abgefangen wird. –
Ich denke, ich war nicht klar. Meine IDE (Eclipse Indigo) unterbricht die Ausführung automatisch, wenn ich es auch erzähle, bei gefangenen/nicht abgefangenen Ausnahmen. Selbst wenn Sie einen JUnit 4 Test durchführen. – Perception