簡體   English   中英

為if else塊編寫jUnit測試用例

[英]Write jUnit test case for if else block

我有一個簡單的if / else塊的方法。 在if和else塊中都調用一個私有方法。

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

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

我可以很容易地改變布爾表達式的行為。

但是我想檢查else塊是否正確發生的方法調用。 我該怎么辦?

關鍵是:編寫單元測試時,測試是否調用內部私有方法是一種反模式!

測試內部實施細節。 對您的測試來說,某種“面向外部的”方法如何執行功能無關緊要。 換句話說,您有以下選擇:

  1. 如果要在被測類的“字段”上調用方法,請使用依賴注入來插入對應對象的模擬版本。 然后,您可以驗證是否調用了預期的方法。
  2. 檢查可觀察到的行為。 含義:稱您的“被測方法”; 並檢查返回這些方法的值; 或在致電后使用其他獲取方法檢查類的內部狀態。

換句話說:您的每個“公共”方法都應具有明確的定義含義。 因此,如果您調用它們,它們將具有定義的效果; 並且應該觀察/確認這種影響。

很可能您當前的設計確實支持這些想法。 然后,認真考慮:考慮退后一步並更改設計。 因為:您創建了無法合理測試的內容。 然后,您的設計還有其他問題的機會。

檢查私有方法是否被調用並不意味着您應該嘗試在單元測試中進行測試。
這不是驗收測試。 通常,您要測試類的行為和/或行為的結果。
就您而言,我看到了兩種可能的解決方法:

  • 將您的設計更改為具有兩個類,並模擬被調用的類。

對於這種方式,我想您必須知道。

  • 使行為產生結果。

例如,您可以在根據initializeScan()stopScan()邏輯設置的類中添加枚舉字段ScanState

ScanState示例:

public enum ScanState{
  (INITIALIZED, STOPPED)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM