2011-02-27 121 views
0

我有setter函數,通過在更改私有變量之前將它傳遞給驗證函數來檢查它們的輸入數據。如果數據無效,getter函數會拋出異常。如何將setter函數和數據驗證函數分開,而不必爲每個輸入測試用例重複所有輸入測試用例?兩個函數都以相同的方式驗證數據。單元測試類似的功能

編輯:對不起,我應該包括代碼開始。

setterFunction(String value) { 
    if (valueValid()) { 
     // Update member variable 
    } else { 
     throw new RuntimeException("Invalid Data"); 
    } 
} 

valueValid()和setterFunction都失敗了相同的值,所以我不想有重複的測試代碼。

+1

發佈您的setter,驗證和getter方法。在沒有代碼參考的情況下,很難獲得你正在談論的內容。 – mmccomb 2011-02-27 20:34:25

回答

0

我認爲用所有測試用例測試驗證器是明智的,然後測試setter和getter使用一兩個簡單的例子來正確調用驗證器。

如果事情失敗,這樣 - 你也有更好的理解,其中的錯誤是

+0

這就是我的想法,但我不確定是否有更好的方式,我不知道。 – mike9182 2011-02-27 20:41:01

+0

嗯,我不認爲它有更多的東西 - 這種方式沒有重複的測試代碼,而較小的組件單獨測試。我認爲這將是最佳實踐,你的常識並沒有讓你失望。 – Galz 2011-02-27 20:48:00

0

你可以設計你的對象不同,以及(驗證或制定者/吸氣)。讓你的對象定義一個構造函數,它需要一小部分信息才能正確構造一個對象。然後有另一種方法repInvariant()(Liskov),它將驗證對象內的所有內部變量是可組合的可接受的。

然後如果你確實有一個setter,它可以在設置變量之後調用repInvariant()。也許甚至撤消設置的方法調用。

public class A 
    public A(B b, Cc...) { 
     this.b = b; 
     ... 
     this.repInvariant(); 
    } 
    public void setB(B b) { 
     var oldB = this.b; 
     try { 
     this.b = b; 
     this.repInvariant(); 
     } catch (InvalidArgumentException e) { 
     this.b = oldB; 
     throw e; 
     } 
    } 
    public void repInvariant() { 
     if (this.b == null) { 
      throw new IllegalArgumentException("B must not be null"); 
     } 
    } 
    }