java - 如何使用 jdb 调试 JUnit 测试用例?

标签 java unit-testing debugging junit jdb

我在调试 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,抱歉。

最佳答案

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

关于java - 如何使用 jdb 调试 JUnit 测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13878210/

相关文章:

java初始化一个类的字段

ASP.NET MVC : testing a controller with XUnit

c++ - gdb 映射显示不正确的成员变量

java - org.openqa.selenium.WebDriverException : Error forwarding the new session cannot find : Capabilities

java - Thymeleaf CSS 未加载

java - 如何创建对象的 OOP 基础知识

ruby-on-rails - 如何使用 Rails 控制台进行调试并放入应用程序

PHPUnit 数据提供程序参数计数错误

c# - 是否可以遍历枚举中的每个选择?

.net - 你如何调试 ASP.net HTTPHandler