java - 使用 JUnit 运行测试用例时,在 Eclipse 调试中禁用拖放到框架功能

标签 java eclipse debugging junit

环境: Linux、Eclipse Juno、Java 7、JUnit

当一个简单的应用程序(一个带有 main 方法的 java 类)在 Debug模式下运行时,“Drop to Frame”功能在 Eclipse 中运行良好。但是,如果从 junit 测试用例调用相同的方法,则 Eclipse 中的“Drop to Frame”功能将被禁用。来自文档

Note this command is only available if the current VM supports drop to frame and the selected stackframe is not the top frame or a frame in a native method.

正如我们在运行 junit 测试用例时从 Debug 窗口中的堆栈帧中看到的那样,有一个帧 'NativeMethodAccessorImpl.invoke' 是原生的。我假设这就是“Drop to Frame”被禁用的原因。

让我知道这个推理是否正确,如果是,请告诉我是否有任何解决方法可以解决这个问题。

最佳答案

我在 Windows 下使用 Eclipse Luna、Java 7。 情况仍然如所描述的那样:对于紧跟在“NativeMethodAccessorImpl.invoke”帧之后的测试方法,“Drop to frame”被禁用。 “Drop to frame”的禁用状态绑定(bind)到 org.eclipse.jdt.internal.debug 类中相应的 supportsDropToFrame() 方法 canDropToFrame()。 core.model.JDIStackFrame, (在我的发行版中)plugins/org.eclipse.jdt.debug_3.8.102.v20150115-1323/jdimodel.jar 的一部分。 方法 supportsDropToFrame() 检查是否可以丢弃特定帧,并进行测试

  1. JVM 必须支持丢帧
  2. 框架不能是最顶层框架
  3. 框架不能是原生的
  4. 之前的框架不能是原生的

所以 Ramesh 的假设是正确的。 这是测试 3 + 4 的原始代码片段:

int index = 0;
JDIStackFrame frame = null;
while (index < frames.size()) {
    frame = (JDIStackFrame) frames.get(index);
    index++;
    if (frame.isNative()) {
        return false;
    }
    if (frame.equals(this)) {
        if (jdkSupport) {
            // JDK 1.4 VMs are currently unable to pop the
            // frame directly above a native frame
            if (index < frames.size()
                    && ((JDIStackFrame) frames.get(index))
                            .isNative()) {
                return false;
            }
        }
        return true;
    }
}

评论表明它是用 JDK 1.4 编写的,所以也许与此同时,JVM 现在也可以将帧丢弃到 native 帧之上。

我创建了 JDIStackFrame 的补丁版本,它跳过了测试 4。 现在,当在 Junit 测试方法中暂停时,“Drop to frame”已按预期启用。

但是当实际丢帧时,我收到一个错误消息框,上面写着 “com.sun.jdi.InternalException:收到错误代码回复:32 发生弹出堆栈帧”。

我假设这是一个 JDWP 错误代码。 因此,这样的“Drop to frame”似乎在 JDK 1.7(不知道 1.8)中不起作用,而且它不是 Eclipse 的东西。

关于java - 使用 JUnit 运行测试用例时,在 Eclipse 调试中禁用拖放到框架功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13472562/

相关文章:

java - 如何在thrift中使用PHP和JAVA

java - 访问Scala变量: 'not found value: variable_name' Issue

java - 网络服务错误

c++ - 二维 vector 大小的 Visual Studio 2015 断点条件

java - 使用 Maven 修改 tomcat 部署的启动脚本

java - 在 Eclipse 中增加 Java 堆大小的问题

android - 运行项目时如何通过eclipse安装.apk文件

java - 如何在 Eclipse 中将 Java 属性文件添加到我的 Java 项目中

html - 如何格式化 float 的 div 以包含静态定位的元素?

java - 使用 Eclipse 远程调试 'eclipse RCP application"