在执行单元测试期间检查是否附加了调试器

时间:2014-09-23 08:13:14

标签: java debugging junit

如果调试器附加到当前的测试执行,有没有办法检查JUnit代码?
在.NET / C#中,我知道Debugger.IsAttached可以实现这一点。

用例是在连接调试器时更改或完全禁用测试超时,因为如果您只有大约15秒(定义的超时)来调试测试,这非常烦人。

2 个答案:

答案 0 :(得分:4)

这不是100%的故障安全方法,但您可以检查调度器使用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中没有任何特权,这是很自然的。

答案 1 :(得分:0)

基于拉斐尔的答案:

    private static boolean isDebug() {
        return ManagementFactory.getRuntimeMXBean().getInputArguments().stream().anyMatch(arg->arg.contains("jdwp=") && arg.contains("suspend=y"));
    }