在JMockit中调试部分模拟

ctr*_*ran 5 eclipse debugging jmockit

使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码不会调试到SampleClass中的方法.

是的,我尝试过-javaagent属性.

ctr*_*ran 7

由Rogerio在JMockit Google的讨论组中回答.

JVM在重新定义类之后丢弃在类上设置的断点(只要模拟了类,JVM就会执行该断点).

要重置断点,请在测试方法之前停止调试器,就在它进入被测代码之前.也就是说,在测试方法中,在本例中调用"SampleClass"的行上设置断点.