【发布时间】:2012-12-14 11:55:35
【问题描述】:
我在调试 JUnit 测试用例时遇到问题。我正在使用 Java v6 和 JUnit Framework v3.8.2。
我这样调用 jdb:
jdb junit.textui.TestRunner MyTest
问题是我不知道 TestRunner 从我的 TestCase 类创建的对象的名称。比如我想打印一个方法的返回值,但是不知道对象的名字怎么调用呢?
编辑:异常发生在第45行,这是我在jdb中执行“where”时得到的调用堆栈:
[1] MyTest.test1 (MyTest.java:44)
[2] sun.reflect.NativeMethodAccessorImpl.invoke0 (native method)
[3] sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57)
[4] sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
[5] java.lang.reflect.Method.invoke (Method.java:616)
[6] junit.framework.TestCase.runTest (TestCase.java:164)
[7] junit.framework.TestCase.runBare (TestCase.java:130)
[8] junit.framework.TestResult$1.protect (TestResult.java:106)
[9] junit.framework.TestResult.runProtected (TestResult.java:124)
[10] junit.framework.TestResult.run (TestResult.java:109)
[11] junit.framework.TestCase.run (TestCase.java:120)
[12] junit.framework.TestSuite.runTest (TestSuite.java:230)
[13] junit.framework.TestSuite.run (TestSuite.java:225)
[14] junit.textui.TestRunner.doRun (TestRunner.java:121)
[15] junit.textui.TestRunner.start (TestRunner.java:185)
[16] junit.textui.TestRunner.main (TestRunner.java:143)
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
当我尝试打印方法或转储对象时,我得到“名称未知”。
Edit3:我只是忘记在使用 javac 时使用 -g,抱歉。
【问题讨论】:
-
您能澄清一下您所说的对象名称是什么意思吗?在 JDB 中,您可以在类中设置断点,而不是在对象中。你有什么理由不能使用 Eclipse 或 Netbeans?
-
不,但我想通过命令行来做。我可以在我的测试用例类中设置断点就好了,但是该类是由 JUnit 测试运行程序初始化的,这意味着创建了一个对象并且我不知道该对象的名称。
-
JUnit 使用“MyTest()”构造函数实例化您的类并在其上调用“test1”方法。如果在第 45 行设置断点,则执行将停在那里。我不明白为什么你需要对象的名称。而且我仍然不太明白“对象的名称”是什么意思,Java 对象是通过引用来寻址的。可以分享源代码吗?我们可能会更好地了解您的用例。如果您首先尝试使用某些 IDE 进行调试,也可能会更好。或者至少共享您在命令行中发出的命令。
-
你说得对,对不起,我把事情搞混了。我想我知道对象的名称,但是每当我尝试在 jdb 中访问它时,我都会得到“名称未知”。
标签: java unit-testing debugging junit jdb