Java 如何用jdb调试JUnit测试用例?

Java 如何用jdb调试JUnit测试用例?,java,unit-testing,debugging,junit,jdb,Java,Unit Testing,Debugging,Junit,Jdb,我在调试JUnit测试用例时遇到问题。我正在使用JavaV6和JUnitFramework v3.8.2 我这样调用jdb: jdb junit.textui.TestRunner MyTest 问题是我不知道TestRunner从我的TestCase类创建的对象的名称。例如,我想打印一个方法的返回值,但当我不知道对象的名称时,如何调用该方法 编辑:异常发生在第45行,这是我在jdb中执行“where”时得到的调用堆栈: Edit2:我把事情搞混了,我知道我想打印的对象的名称,但它仍然不起作用

我在调试JUnit测试用例时遇到问题。我正在使用JavaV6和JUnitFramework v3.8.2

我这样调用jdb:

jdb junit.textui.TestRunner MyTest
问题是我不知道TestRunner从我的TestCase类创建的对象的名称。例如,我想打印一个方法的返回值,但当我不知道对象的名称时,如何调用该方法

编辑:异常发生在第45行,这是我在jdb中执行“where”时得到的调用堆栈:

Edit2:我把事情搞混了,我知道我想打印的对象的名称,但它仍然不起作用。我写了一个小测试用例和类来解释确切的问题

这是测试用例:

import junit.framework.TestCase;

public class TestJUnit extends TestCase {

    public void test1() {
        try {
            JUnitTestClass mtc = new JUnitTestClass();
            assertTrue(mtc.method1() == 1);
            assertTrue(mtc.method1() == 2);
        } catch (Exception exc) {
            fail(exc.getMessage());
        }
    }
}
这是要测试的类:

public class JUnitTestClass {

    private int att1 = 0;

    public int method1() {
        this.att1 += 1;
        return this.att1;
    }
}
然后我运行调试器,如下所示:

bash-4.2$ jdb -classpath $CLASSPATH junit.textui.TestRunner TestJUnit
Initializing jdb ...
> stop at TestJUnit:8
Deferring breakpoint TestJUnit:8.
It will be set after the class is loaded.
> run
run junit.textui.TestRunner TestJUnit
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
> 
VM Started: Set deferred breakpoint TestJUnit:8
.
Breakpoint hit: "thread=main", TestJUnit.test1(), line=8 bci=8
8                assertTrue(mtc.method1() == 1);

main[1] print mtc.method1()
com.sun.tools.example.debug.expr.ParseException: Name unknown: mtc.method1
mtc.method1() = null
main[1] dump mtc
com.sun.tools.example.debug.expr.ParseException: Name unknown: mtc
mtc = null
当我试图打印方法或转储对象时,我得到“Name unknown”


Edit3:我只是在使用javac时忘了使用-g,对不起。

您能在实际的测试方法中设置一个断点,然后在调用堆栈中断时查看它,并进入实际的JUnit代码吗


使用可视化调试器,这可能是最简单的。它还假设您正在运行的JUnit实例是使用调试支持构建的。否则,您将无法获得任何象征性信息。

对不起,各位,我对这一切都不熟悉,我犯了一个愚蠢的错误。调用javac生成测试用例类文件时,我忘记了使用-g命令。现在可以了。

您能澄清一下对象名称是什么意思吗?在JDB中,可以在类而不是对象中设置断点。有什么原因不能使用Eclipse或Netbeans吗?没有,但我想通过命令行来完成。我可以在测试用例类中设置断点,但该类是由JUnit测试运行程序初始化的,这意味着创建了一个对象,但我不知道该对象的名称。JUnit使用“MyTest()”构造函数实例化类,并对其调用“test1”方法。如果在第45行设置了断点,那么执行将在那里停止。我不明白你为什么需要对象的名称。我仍然不明白“对象名”是什么意思,Java对象是通过引用寻址的。你能分享源代码吗?我们可以更好地理解您的用例。另外,如果您首先尝试使用一些IDE进行调试,可能会更好。或者至少在命令行中共享了你发出的命令。你是对的,对不起,我把事情弄混了。我想我知道对象的名称,但是每当我试图在jdb中访问它时,就会得到“name unknown”。这是从命令行运行JUnit测试的好例子。只是一个小建议:与其失败,不如抛出一个异常。在我的实践中,我只在代码不应该在某个分支中运行并且我没有要抛出的异常的情况下使用fail()。使用它的方式将删除堆栈跟踪,这在这种情况下非常重要。
bash-4.2$ jdb -classpath $CLASSPATH junit.textui.TestRunner TestJUnit
Initializing jdb ...
> stop at TestJUnit:8
Deferring breakpoint TestJUnit:8.
It will be set after the class is loaded.
> run
run junit.textui.TestRunner TestJUnit
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
> 
VM Started: Set deferred breakpoint TestJUnit:8
.
Breakpoint hit: "thread=main", TestJUnit.test1(), line=8 bci=8
8                assertTrue(mtc.method1() == 1);

main[1] print mtc.method1()
com.sun.tools.example.debug.expr.ParseException: Name unknown: mtc.method1
mtc.method1() = null
main[1] dump mtc
com.sun.tools.example.debug.expr.ParseException: Name unknown: mtc
mtc = null