2016-08-14 58 views
0

我有一個簡單的if/else塊的方法。在if和else塊中都調用私有方法。寫jUnit測試案例,如果其他塊

下面是我想寫單元測試用例的方法。

public void enableBLEScan() { 
     if (<some boolean expression which can be mocked>) { 
      initializeScan(); 
     } else { 
      stopScan(); 
     } 
    } 

我可以很容易地存根布爾表達式的行爲。

但是如果else塊發生正確,我想檢查裏面的方法調用。我怎麼能這樣做?

+0

這兩種私人方法在做什麼?也許你可以檢查這些方法設置的條件?或者你可以使用反射,請參閱http://stackoverflow.com/questions/34571/how-to-test-a-class-that-has-private-methods-fields-or-inner-classes?rq=1 – simonv

+1

所以有什麼問題? –

+0

@OliverCharlesworth如果else塊發生正確,我想檢查裏面的方法調用。 –

回答

0

檢查調用私有方法不是你應該嘗試在單元測試中測試。
這不是一個驗收測試。通常,你想測試一個類的行爲和/或行爲的結果。
在你的情況,我看到兩個乾淨的可能性:

  • 改變你的設計有兩個類和嘲諷稱爲類。

對於這種做法,我想你必須知道。

  • 使行爲創建結果。

例如,你可以在你的類,你在根據和initializeScan()stopScan()邏輯設置添加一個枚舉場ScanState

ScanState例如:

public enum ScanState{ 
    (INITIALIZED, STOPPED) 
} 
+0

直接進入「enum」陷阱。如果你正在處理狀態,那麼創建一個**狀態機**;意思是:有一個抽象基類並使用多態將每個狀態建模爲子類。如果你開始使用像這樣的枚舉,那麼你一下子就會處理switch語句。嚴重:不要去那裏。 – GhostCat

+0

我們不知道在該方法中做了哪些事情。所以,我只是以狀態爲例,依靠我們的單個信息:'initializeScan()'和'stopScan()'。指針是「使行爲來創建結果」。 當你說'含義:有一個抽象基類,並使用多態性來將每個狀態建模爲子類'。我不同意。擁有狀態字段並不意味着始終使用狀態設計模式。如果不需要,你可以使用沒有開銷和沒有狀態機的狀態。例如,一個流可能有一個簡單字段的狀態。 – davidxxx

1

的一點是:如果測試被稱爲內部私有方法...編寫單元測試時是一個反模式!

你做不是測試內部實現細節。對於你的測試來說,一些「面向外部」的方法如何去做它並不重要。換句話說,您有以下選擇:

  1. 如果您正在測試您的類的「字段」上調用方法,請使用依賴注入來插入相應對象的模擬版本。然後你可以驗證預期的方法被調用。
  2. 檢查可觀察行爲。含義:打電話給你的「正在測試的方法」;並檢查返回的這些方法的值;或在打電話後使用其他獲得者來檢查班級的內部狀態。

換句話說:你的每一個「公共」方法都應該有一個明確的定義的含義。所以,如果你給他們打電話,他們會有明確的效果;這個效應應該被觀察/斷言。

這很可能是你目前的設計真的支持這些想法。然後,認真考慮:考慮退後一步,改變你的設計。因爲:你創造了一些不合理的可測試的東西。那麼很可能......你的設計也有其他問題。