2013-05-29 84 views
2

我已經實現了一個新類Holder。以下是目標:單元測試構建器方法

  1. 三個字段。字段1和2是整數,字段3是布爾值。
  2. 一旦構建,它不應改變(不可變)。因此這些字段只有獲得者。
  3. 字段1和2通過從5種可能類型(字符串格式1,字符串格式2,int,類型A和類型B)中提取信息進行初始化。字段3設置爲true/false。

這使我留下的問題是,有50個可能的構造函數選項。 5×5×2,這是不理智的或可伸縮的(加6型,我不得不寫一個巨大的變化),所以我用一個生成器模式:

class Builder { 
    Builder s1SetField1(String Format1), 
    Builder s2SetField1(String Format2), 
    ... 
    Builder s1SetField2(String Format1), 
    ... 
    Builder setField3(boolean b) 
    Holder build() 
} 

這個作品真的很好。對於字段1初始化我有5個構建器方法,對於字段2初始化我有5個構建器方法,布爾值有一個。一旦設置了字段,就調用build()方法,該方法使用格式正確的字段調用私有構造函數並返回一個新對象。

我有單元測試的問題。我想建立一個列表,其中填充了使用Builder方法的每個排列構建的代表性對象。現在我回到50個新的Build()調用。 我想過創建3個列表 - field1List,field2List和field3List。然後,分層遍歷每一個:

for (Object f1 : field1List) { 
    for (Object f2 : field2List) { 
     for (boolean f3 : field3List) { 
      returnList.add(new Builder().setField1(f1).setField2(f2).setField3(f3).build()); 
     } 
    } 
} 
return returnList; 

當然,在列表中保持混合對象似乎笨重。有沒有更好的方法來初始化使用每個排列?

+3

爲什麼你需要測試每個排列?爲什麼不分別測試構建器的每個setXxx()方法,然後測試構建方法? –

+0

我已經簡化了這個例子。在調用build()時,背景中有一些構建器規則說明setField1和setField2如何根據另一個和布爾值的狀態進行解釋。 – Terry

+0

@JBNizet絕對是在這裏的正確軌道 - 看起來像你需要能夠分解問題,以允許單獨測試不同的部分。這可能是一種不同的方法可以更容易地單獨測試不同的部分 - 儘管很難說出沒有更詳細的例子來理解不同的現場構建者如何相互作用。 – robjohncox

回答

3

試圖測試輸入到系統的每個排列都是瘋狂的。即使是小型系統,排列的數量也是巨大的。

而是使用等價類劃分那些許多排列分成更小的組等價類的,並且每個等價類只有一個測試用例。使用您對代碼解決問題的知識以及編寫它的方式(或者可能寫入,如果您正在測試其他人的代碼)選擇一組具有以下屬性的等價類:如果程序正確運行如果是很可能在類中的所有其他情況下正確工作。這提供了成本有效的測試用例。

就你而言,我會單獨測試build(),再加上setXXX()方法中的每一個測試,然後再測試build()方法。