2011-01-27 69 views
5

使用JMockit 0.999.4和JDK6,是否可以調試到部分模擬類中?在JMockit中調試部分模擬

考慮以下測試:

@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和調試系統輸出線的放置斷點「步過」在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屬性。

回答

7

由Rogerio在JMockit Google's discussion group的回答。

的JVM丟棄它被重新定義 (其JMockit確實每當一個類被嘲笑)後一類設置的斷點。

要重置斷點,請在測試方法中停止調試程序,只需在 之前將其輸入到測試中的代碼中。也就是說,在 示例中,在調用「SampleClass」的行上設置 測試方法的斷點。

+0

對於好奇,這是JVM錯誤鏈接:https://bugs.openjdk.java.net/browse/JDK-7036136 – 2014-06-26 21:15:30