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 中调试“Step Over”将进入 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 回答