当我进行JUnit测试时,我希望调试器在测试代码中的任何异常被抛出以使测试失败的时刻停止,以便检查出错了什么。是否有可能配置IntelliJ的调试器来做到这一点,而不是打破其他异常?
如果我在任何未捕获的异常上设置了异常断点,则这不起作用,因为JUnit捕获了异常。如果我尝试使用catch类org.junit对捕获的异常进行断点中断,那也不起作用,因为异常在Javas反射机制到达JUnit之前被Javas反射机制捕获并包装。所以我在这里有点亏本 - Eclipse只是在最初的例外停止。
澄清:我在讨论代码I测试中的异常或从那里调用的代码,而不是测试中的断言失败。例如,考虑这些测试:
@Test
public void thisShouldBreak() {
int i = 25 - 25;
int j = 17 / i;
}
private void neverBreakHereSinceThisIsCaught() {
int i = 14 - 14;
int j = 29 / i;
}
@Test
public void thisShouldNotBreak() {
try {
neverBreakHereSinceThisIsCaught();
} catch (ArithmeticException e) {
// ignored or handled
}
}
@Test
public void thisShouldNotBreakEither() {
try {
getClass().getDeclaredMethod("neverBreakHereSinceThisIsCaught").invoke(this);
} catch (Exception e) {
// ignored or handled
}
}
我希望IntelliJ在抛出ArithmeticException的地方执行测试thisShouldBreak
时停止,以便我可以检查导致异常的i的值。但是,我不希望IntelliJ在neverBreakHereSinceThisIsCaught
中停止,因为抛出的异常没有到达JUnit。我尝试失败了:
- neverBreakHereSinceThisIsCaught, too, and loads of other places.
- an exception breakpoint only on uncaught exception is never hit at all, since JUnit catches and wraps those exceptions.
- a catch class filter
org.junit中被捕获的异常中断的异常断点。*`在JUnit的JUnit结束Java反射调用的许多内部位置中断。
答案 0 :(得分:2)
答案 1 :(得分:2)
这就是我所做的:
您基本上想要做的是告诉Intellij在catch类过滤器为junit的任何异常(Caught&Uncaught)上停止,以便仅由junit捕获的异常会导致调试器停止。
使用诸如Tomcat之类的应用服务器时,您可能会遇到类似的问题,该服务器会捕获异常。同样,您可以按Tomcat软件包过滤catch类。
答案 2 :(得分:1)
我如何处理这个:
答案 3 :(得分:1)
如果您只需要在JUnit中捕获的异常,则可以使用" catch类过滤器"在异常断点中,在JUnit中指定一个被捕获的类。
答案 4 :(得分:1)
在摆弄了一段时间之后,以下似乎效果最好:
“任何异常”对捕获类过滤器org.junit.runners.*
和类过滤器-org.junit.*
的捕获和未捕获异常的断点,以消除JUnit机制本身抛出的捕获异常。
对于捕获和未捕获的AssertionError的无条件断点似乎也是一个好主意,当断言失败时检查测试本身的局部变量中的数据。