2017-04-26 66 views
0

我是JMockit 1.31的新手。使用JMockit,我試圖爲下面的代碼編寫單元測試腳本,但是我收到斷言失敗錯誤。請幫我弄清楚這個問題。如何使用JMockit模擬非靜態方法1.31

主類:ForUnit.java

public class ForUnit { 
    private UnitHelper unit = new UnitHelper(); 

    public int add() { 
     return unit.getNumberA() + unit.getNumberB(); 
    } 

    public int subtract() { 
     UnitHelper unit = new UnitHelper(); 
     return unit.getNumberA() - unit.getNumberB(); 
    } 

    public int subtractFromThird() { 

     return unit.getNumberA() - unit.getNumberB() + 10; 
    } 
} 

依賴類:UnitHelper

public class UnitHelper { 
    private int a = 200; 
    private int b = 100; 

    public int getNumberA() { 
     return a; 
    } 

    public int getNumberB() { 
     return b; 
    } 
} 

單元測試腳本使用JMockit - ForUnitTest.java

public class ForUnitTest { 

    private final int i =10, j=8; 

    @Tested 
    private ForUnit forUnit; 

    @Test 
    public void test() { 

     final UnitHelper helper = new UnitHelper(); 

     new Expectations() {{ 
      helper.getNumberA(); result = i; 
      helper.getNumberB(); result = j; 
     }}; 

     assertEquals(i+j, forUnit.add()); 
    } 

} 

回答

1

您正在使用您的測試方法創建一個新的UnitHelper,該類未在ForUnit類中使用。

您需要一種方法將UnitHelper注入到ForUnit,以便您可以嘲笑其行爲。

你可以試着這樣做:

public class ForUnit { 
    private UnitHelper unit = new UnitHelper(); 
    public ForUnit(UnitHelper unitHelper) { 
    this.unit = unitHelper; 
    } 
    ... 
} 

然後在您的測試,你可以注入helper對象。

@Test 
public void test() { 
    final UnitHelper helper = new UnitHelper(); 
    forUnit = new ForUnit(helper); 
    new Expectations() {{ 
     helper.getNumberA(); result = i; 
     helper.getNumberB(); result = j; 
    }}; 
    assertEquals(i+j, forUnit.add()); 
    } 

UPDATE:

如果你想避免創建一個新的構造。你可以使用setter方法。

public class ForUnit { 
    private UnitHelper unit = new UnitHelper(); 
    setUnitHelper(UnitHelper unit) { 
     this.unit = unit; 
    } 
} 
+0

謝謝你Alayor。有沒有更多的選擇,而不是添加構造函數? –

+0

您只需添加一個帶有'package'可見性的setter方法。 – alayor

+0

是的,顯然我們可以使用setter/constructors。但是,有沒有其他解決方案? –

相關問題