2011-01-27 18 views
5

JMockit 0.999.4とJDK6を使用すると、部分的に嘲笑されたクラスにデバッグすることは可能ですか? SampleClass方法を入力しますEclipseで「ステップオーバー」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とデバッグにおけるSYSOUTラインのそれぞれにブレークポイントを置く:

は、次の試験を考えてみましょう。

は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; 
    } 
} 

の値にstaticInt設定から静的初期化子を防止する次のように検討しかし、このコードはSampleClassにおけるメソッドにデバッグしないであろう。

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

答えて

7

JMockitでRogerioによって回答されましたGoogle's discussion group

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

ブレークポイントをリセットするには、テストメソッドでデバッガを停止します。テストするコードに入る前に と入力してください。つまり、この の例で "SampleClass"を呼び出す行の テストメソッドでブレークポイントを設定します。好奇心のために

+0

、これはJVMのバグのリンクです:私もJUnitテストメソッドで直接ブレークポイントを設定することはできませんhttps://bugs.openjdk.java.net/browse/JDK-7036136 –

+0

。私はjdk 1.8とEclipse Mars(4.5.1)を使用しています。誰もが同じ問題とそれに対する解決策を持っていますか? – Joern

+0

私は上記のテストとの違いを発見しました。私は、メンバメソッドで '@ Tested'アノテーションを使用しています。 '@ Before'メソッドで手動でSUTを作成することでこれを置き換えると、テストクラス内のブレークポイントが正しく動作しています。 – Joern