有没有一种方法可以在JUnit代码中检查当前测试执行是否附加了调试器?
在.NET/C#中,我知道可以使用Debugger.IsAttached
实现。
使用情况是当调试器被附加时更改或完全禁用测试超时,因为如果您只有约15秒(定义的超时时间)来调试测试,则这非常烦人。
有没有一种方法可以在JUnit代码中检查当前测试执行是否附加了调试器?
在.NET/C#中,我知道可以使用Debugger.IsAttached
实现。
使用情况是当调试器被附加时更改或完全禁用测试超时,因为如果您只有约15秒(定义的超时时间)来调试测试,则这非常烦人。
这种方法并非百分之百可靠,但您可以检查Java Debug Wire Protocol(JDWP)是否处于活动状态,它是调试器用于连接JVM的协议。您可以通过检查JVM的输入参数来实现这一点,例如:
boolean isDebug() {
for(String arg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
if(arg.contains("jdwp=")) {
return true;
}
}
return false;
}
然而,如果其他人命名了jdwp
或者该协议用于其他用途,则可能会返回错误的结果。此外,该命令可能会在未来发生变化,这使得它几乎不具备可靠性。当然,这种方法并不是JUnit特有的,但由于JUnit在JVM内没有任何特权,因此这是很自然的。
根据Rafael的回答:
private static boolean isDebug() {
return ManagementFactory.getRuntimeMXBean().getInputArguments().stream().anyMatch(arg->arg.contains("jdwp=") && arg.contains("suspend=y"));
}
suspend=y
是默认值。因此,最好检查是否不存在 suspend=n
。 - gaborsch