2015-11-04 122 views
0

我正在爲一個具有調用同一類的其他方法的方法編寫單元測試。這導致很多情景需要測試。單元測試在同一個類中調用其他方法的方法應該是什麼?

我認爲我可以偵測()方法調用的行爲,以便我只測試被測試的方法,而不會打擾其他方法的行爲。我將通過針對這些方法中的每一種的單獨測試來對其進行報道。

class MyClass{ 

    public void myMethodToBeTested(){ 
    aPrivateMethod(); 
    aPublicMethod(); 
    } 

    private void aPrivateMethod(){ 
    // doing something 
    // Has some if else scenarios 
    } 

    public void aPublicMethod(){ 
    // doing something 
    // Has some if else scenarios 
    } 
} 

什麼是最好的方式來單元測試這個類?

回答

3

您應該通過調用該類的外部接口(即公共方法)進行測試。

如果這些方法在同一個類中調用私有方法,那麼這些私有方法也需要全面覆蓋 - 否則它們將如何被測試?

存根或間諜只有在被測試的類之外調用資源或類時纔有意義。

您正試圖測試整個班級,而不僅僅是個別的方法。

+0

Spock的「其中」塊確實有助於改變公衆方法的參數,以覆蓋私有方法中的所有行 –

0

在我看來,aPrivateMethod可以作爲一個單獨的類作爲公共,並且aPublicMethod的主體也可以是該類中的另一種方法。

重構之後,您可以注入新的類並在相應的位置調用這些方法。

說到測試,您可以模擬/存根這些方法並測試myMethodToBeTested()。

0

首先,我會將私有方法更改爲默認/包級別。這樣,佔用相同包的單元測試就可以訪問它,但是包之外的其他方法不能觸及它。與私人範圍並不完全相同,但大部分時間都足夠接近。

然後,在MyClass上設置Spy()。

如果你不清楚的這個詞:

  • 一個模擬的()在班上總是會返回null或0到任何方法調用
  • 存根()上一個類可以讓你定義該類中的某些方法應該做什麼,但是任何你不明確指定的東西總是返回null或者0 Spy()讓你創建一個類的對象,並且所有的方法都可以使用除了你可以重寫一些的那些方法

因此,創建一個Spy(MyClass),指定aPrivateMethod()和aPublicMethod()應​​該返回以用於測試目的,然後調用myMethodToBeTested()並查看返回的內容。在你的例子中,該方法是無效的,所以它不返回任何東西。但你總是可以:

  1. 定義間諜()
  2. 有aPublicMethod()設置/修改基於輸入或內部狀態(在你的間諜(你的首要方法變量)可以帶參數的變量外)
  3. 調用myMethodToBeTested()
  4. 檢查變量的內容
相關問題