使用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属性。
答案 0 :(得分:7)
Rogerio在JMockit中回答Google's discussion group。
JVM在重新定义后丢弃在类上设置的断点 (只要模拟了一个类,JMockit就会这样做)。
要重置断点,请在测试方法中停止调试器 在它进入被测代码之前。也就是说,在中设置一个断点 测试方法,在这个调用“SampleClass”的行上 示例