0

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 を使用するのを忘れていました。申し訳ありません。

4

2 に答える 2

1

申し訳ありませんが、私はこれらすべてに不慣れで、ばかげた間違いを犯しました。javac を呼び出してテスト ケース クラス ファイルを生成するときに -g コマンドを使用するのを忘れていました。それは今動作します。

于 2012-12-14T14:38:18.413 に答える
0

実際のテスト メソッドの 1 つにブレークポイントを設定し、それが壊れたときにコール スタックを見て、実際の JUnit コードにステップ アップできますか?

これはおそらく、ビジュアル デバッガーを使用すると最も簡単です。また、実行中の JUnit インスタンスがデバッグ サポート付きでビルドされていることも前提としています。そうしないと、シンボリック情報を取得できません。

于 2012-12-14T12:06:46.010 に答える