5

JMockit 0.999.4 と JDK6 を使用して、部分的にモックされたクラスにデバッグできますか?

次のテストを検討してください。

@Test
public void testClass() {
    SampleClass cls = new SampleClass();

    System.out.println(cls.getStaticInt());
    cls.setVal(25);
    System.out.println(cls.getVal());
}

static class SampleClass {
    static int staticInt = 5;
    private int val;

    {
        staticInt = 10;
    }

    public int getStaticInt() {
        System.out.println("Returning static int and adding a line for debugging");
        return staticInt; 
    }

    public void setVal(int num) {
        System.out.println("Setting val and adding a line for debugging");
        this.val = num;
    }

    public int getVal() {
        System.out.println("Returning val and adding a line for debugging");
        return this.val;
    }
}

SampleClass の各 sysout 行にブレークポイントを配置し、Eclipse で「ステップ オーバー」をデバッグすると、SampleClass メソッドに入ります。

静的初期化子が staticInt を値 10 に設定するのを防ぐ次のことを検討してください。

@Test
public void testClass(@Mocked(methods = "$clinit") SampleClass cls) {       

    System.out.println(cls.getStaticInt());
    cls.setVal(25);
    System.out.println(cls.getVal());
}

static class SampleClass {
    static int staticInt = 5;
    private int val;

    {
        staticInt = 10;
    }

    public int getStaticInt() {
        System.out.println("Returning static int and adding a line for debugging");
        return staticInt; 
    }

    public void setVal(int num) {
        System.out.println("Setting val and adding a line for debugging");
        this.val = num;
    }

    public int getVal() {
        System.out.println("Returning val and adding a line for debugging");
        return this.val;
    }
}

ただし、このコードは SampleClass のメソッドにデバッグしません。

はい、-javaagent プロパティを試しました。

4

1 に答える 1

7

JMockit Google のディスカッション グループで Rogerio が回答しました。

JVM は、クラスが再定義された後、クラスに設定されたブレークポイントを破棄します (JMockit は、クラスがモックされるたびにこれを行います)。

ブレークポイントをリセットするには、テスト対象のコードに入る直前に、テスト メソッドでデバッガーを停止します。つまり、この例では「SampleClass」を呼び出す行で、テスト メソッドにブレークポイントを設定します。

于 2011-01-31T15:40:46.160 に答える