2015-04-28 85 views
1

我是Mockito的新手,並試圖找出是否有方法使用Mockito的WhiteBox功能在公共方法內設置成員變量的值。使用Mockito WhiteBox在方法範圍內設置成員變量

我試過尋找這個,但似乎沒有參考文獻談論這個。

它是否可行?

謝謝

添加了一個我想要實現的例子。考慮以下課程。

public class FinancialsCalculator { 
    private int va11; 
    private int val2; 

    public int calculateFinancialsAppliedSum() { 
     //In actual application this calc get's Injected using Guice 
     Calculator calc; 

     //Some pre-processing to the values val1 and val2 will be performed here 

     return calc.getSum(val1, val2); 
    } 
} 

現在我需要單元測試上面的類。我想在calculateFinancialsAppliedSum方法的範圍內模擬Calculator類實例。

如果它處於FinancialsCalculator類的級別(即與val1和val2變量處於同一級別),我可以輕鬆地嘲笑它,並使用mockito的Whitebox.setInternalState()將該模擬實例設置爲該類級別private計算器的實例。

不幸的是,由於其他原因,我無法讓這個Calculator實例成爲FinancialsCalculator類的類級別私有實例。它必須在calculateFinancialsAppliedSum方法中。

那麼我怎麼可以在calculateFinancialsAppliedSum方法裏面模擬這個Calculator實例來測試呢?

+3

「公共法內」沒有按」我看起來很清楚。你可以添加一個例子,或者展示一個你想要的「HypotheticalWhitebox」嗎? –

+0

@JeffBowman添加了我想要實現的示例 –

+0

Whitebox是PowerMock的一部分,而不是Mockito。 –

回答

1

沒有辦法像你描述的那樣去做; WhiteBox和類似工具可以改變實例字段的值,因爲它是持久的,但是隻有在方法正在執行時纔在堆棧中存在方法變量,因此無法從方法外部訪問或重置該方法。

因爲計算器是通過Guice注入的,所以可能會有一個很好的注入點(方法,字段或構造函數),您可以在測試中調用自己插入計算器模擬。

你也可以重構,以使測試更加簡單:

public class FinancialsCalculator { 
    private int va11; 
    private int val2; 

    public int calculateFinancialsAppliedSum() { 
     return calculateFinancialsAppliedSum(calc); 
    } 

    /** Uses the passed Calculator. Call only from tests. */ 
    @VisibleForTesting int calculateFinancialsAppliedSum(Calculator calc) { 
     //Some pre-processing to the values val1 and val2 will be performed here 
     return calc.getSum(val1, val2); 
    } 
} 

甚至使方法靜態的,所以它可以完全任意值進行測試:

public class FinancialsCalculator { 
    private int va11; 
    private int val2; 

    public int calculateFinancialsAppliedSum() { 
     return calculateFinancialsAppliedSum(calc, val1, val2); 
    } 

    /** Uses the passed Calculator, val1, and val2. Call only from tests. */ 
    @VisibleForTesting static int calculateFinancialsAppliedSum(
      Calculator calc, int val1, int val2) { 
     //Some pre-processing to the values val1 and val2 will be performed here 
     return calc.getSum(val1, val2); 
    } 
}