环境:Linux, Eclipse Juno,Java7, JUnit
当一个简单的应用程序(带有main方法的java类)在调试模式下运行时,“Drop to Frame”功能在Eclipse中运行良好。然而,如果从junit测试用例调用相同的方法,Eclipse中的“Drop to Frame”功能将被禁用。从文件中
注意:仅当当前VM支持drop to frame且所选stackframe不是顶部帧或本机方法中的帧时,此命令才可用。
正如我们在运行junit测试用例时从Debug窗口中的堆栈框架中看到的,有一个框架“NativeMethodAccessorImpl”。调用“本机”。我想这就是“下降到帧”被禁用的原因。
让我知道这个推理是否正确,如果是,有什么解决办法可以克服这个问题。
我一直通过在@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(假设您的逻辑足够可重入)
这是一个旧版本,但在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()将其内联回来。
我在Windows下使用Eclipse Luna和Java 7。情况仍然如前所述:对于紧跟“NativeMethodAccessorImpl”之后的测试方法,禁用“下降到帧”。调用“框架”。“拖放到帧”的禁用状态绑定到classorg中的方法
。方法SupportsDropFrame()检查特定帧是否可以删除,并进行测试canDropToFrame()
相应的supportsDropFrame()
。日食jdt。内部的调试。果心模型JDIStackFrame(在我的发行版中)是plugins/org的一部分。日食jdt。调试_3.8.102。v20150115-1323/jdimodel。jar
所以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: 这就是我使用的依赖关系: 堆栈跟踪是下一步: 知道哪里出了问题吗?