当前位置: 首页 > 知识库问答 >
问题:

在使用JUnit运行测试用例时,Eclipse调试中禁用了Drop-to-frame功能

刘乐童
2023-03-14

环境:Linux, Eclipse Juno,Java7, JUnit

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

注意:仅当当前VM支持drop to frame且所选stackframe不是顶部帧或本机方法中的帧时,此命令才可用。

正如我们在运行junit测试用例时从Debug窗口中的堆栈框架中看到的,有一个框架“NativeMethodAccessorImpl”。调用“本机”。我想这就是“下降到帧”被禁用的原因。

让我知道这个推理是否正确,如果是,有什么解决办法可以克服这个问题。

共有3个答案

杨海
2023-03-14

我一直通过在@Test函数和一个可以放入帧的thunk之间进行分割来解决这个问题。

在JDK-8之前,我会这样做:

@Test
public void testSomeFooInBar() {
    drop_to_frame_testSomeFooInBar();
}

private void drop_to_frame_testSomeFooInBar() {
    assertTrue(somethingOrWhatever);
}

尽管很冗长,但我坚持在测试函数之后调用thunk,并用名称指示它们的用途(跳转/跳转到帧)。这总是必要的,因为总有人在不阅读注释的情况下进行“重构”,并开始删除“不必要”的thunk

@Test
public void testSomeFooInBar() {
    final Runnable drop_to_frame = () -> {
        assertTrue(somethingOrWhatever);
    };
    jump_to_frame.run();
}

更简单。Eclipse将允许您在可运行的lambda中设置断点,并根据需要多次跳转到frame(假设您的逻辑足够可重入)

吕作人
2023-03-14

这是一个旧版本,但在Eclipse 2018-09、Java 1.8和testng作为测试运行程序的情况下,目前这仍然是一个问题。解决方法(简单而明显)是将测试内容提取到另一个方法中,调试它,然后将其内联。例如。:

@Test
public void test() {
    // test goes here
    assertTrue(true);
}

可以使用重构快捷方式来加快速度:选择测试主体,按Alt Shift M,输入名称“inner”,结果是:

@Test
public void test() {
    inner();
}

private void inner() {
    // test goes here and 'drop-to-frame' works well
    assertTrue(true);
}

调试完成后,通过按Alt Shift I()将其内联回来。

米丰
2023-03-14

我在Windows下使用Eclipse Luna和Java 7。情况仍然如前所述:对于紧跟“NativeMethodAccessorImpl”之后的测试方法,禁用“下降到帧”。调用“框架”。“拖放到帧”的禁用状态绑定到classorg中的方法canDropToFrame()相应的supportsDropFrame()。日食jdt。内部的调试。果心模型JDIStackFrame(在我的发行版中)是plugins/org的一部分。日食jdt。调试_3.8.102。v20150115-1323/jdimodel。jar。方法SupportsDropFrame()检查特定帧是否可以删除,并进行测试

  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现在也可以将帧放在本地帧之上。

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

但是当实际删除帧时,我收到了一个错误消息框,上面写着“com.sun.jdi.内部异常:回复中有错误代码: 32出现了弹出堆栈帧”。

我假设这是一个JDWP错误代码。因此,这样的“下降到帧”似乎在JDK1.7中不起作用(不知道1.8),也不是Eclipse的东西。

 类似资料:
  • 问题内容: 我刚刚在Eclipse上第一次安装了插件m2e。 我编写了一个简单的JUnit(版本4)测试。我可以从Eclipse中运行它,但不能从pom.xml中运行它(alt单击,运行方式,Maven测试)。我想我需要告诉Maven搜索该课程,但我只是不知道如何。 另外,我在groupId“ junit”中找不到JUnit 4:只有版本3.8.1可用。我真的需要为3.x版本而不是4+版本编写测试

  • 我正在为java应用程序编写junit测试用例这里是junit测试代码 在eclipse中运行这段代码后,我会收到以下错误 下面是我的主要java代码 有人能帮忙解决这个错误吗?在这里,我不能单独运行两个测试函数,它们运行得很好,如何一起运行它们

  • 我尝试在Eclipse Oxygo4.7上使用Java9。显然,我已经安装了Java9对marketplace氧气的支持。我无法让junit测试工作。我用两个类创建了简单的maven项目: null null 如何在Eclipse中使用Java9运行这个测试?

  • 我正在使用和构建一个简单的rest API。生产应用程序应该使用redis-session实现,而测试应该使用默认的(非Redis)Spring-Session。 但是,当在项目中声明maven依赖项时,spring-boot将自动创建,而在测试配置中没有注释。 我的设置 申请代码: 测试:

  • 问题内容: 我在Intellij 8中使用Java调试器时,注意到有一个标记为“投下帧”的按钮,有人知道这有什么用吗?如何/为什么使用/有用? 问题答案: 可以在调试器中查看应用程序的调用堆栈。使用“下降帧”功能,您可以“回退”到先前的堆栈帧,在某种意义上可以追溯到过去。如果您错过了想再次看到的关键点,这对于重新输入功能很有帮助。 就像名称“堆栈框架”所暗示的那样,已经对全局状态进行的更改(例如静

  • 我创建了一个简单的测试来尝试Junit 5: 这就是我使用的依赖关系: 堆栈跟踪是下一步: 知道哪里出了问题吗?