2009-09-15 54 views
7

所以我有一個類,它看起來像下面這樣:如何測試重載函數?

public class MyClass 
{ 

    DatabaseDependency _depend; 

    public MyClass(DatabaseDependency depend) 
    { 
     _depend = depend; 
    } 

    public string DoSomething(DBParameter database) 
    { 
     var result = _depend.GetResults(database, ...); 
     string response = String.Empty;   

     // some logic to process the result 

     return response; 
    } 

} 

其中的DbParameter是包含了像服務器,數據庫名,DBTYPE等

現在的一個簡單值類,我想補充過載到DoSomething的,以便它接受一個連接字符串代替的DbParameter參數(假設DatabaseDependency已經有一個過載GetResults它接受一個連接字符串)。

我的問題:我有幾個單元測試,它們描述了用於處理來自DatabaseDependency.GetResults的結果的各種邏輯路徑。當我過載加到DoSomething的,我將基本上重構使得該邏輯由兩個重載重用代碼(即可能將其移動到私人方法)。單元測試的正確方法是什麼?我是否需要同樣多的單元測試來驗證所添加的新超載的所有邏輯路徑?

回答

5

如果您確信您的重載方法只是將字符串轉換爲連接對象,然後委託給原始對象,則應該添加一個測試方法。

但是,如果您重構底層的重載方法,從而導致沒有委派發生,則會崩潰。在這種情況下,我更有信心複製兩種方法的所有測試。

我認爲第一個途徑是最務實的。然而,一段時間運行代碼覆蓋率分析是一個好主意,並且稍後會指出是否需要更多的測試。

1

是的,重構普通處理私有方法 - 我假設你會這樣做無論如何不考慮測試考慮,重複代碼是壞的。思考測試如何引導我們做正確的事情很有趣。

然後,您對每個重疊的起始路徑都有幾個簡單的測試。

5

如果你的代碼保持目前的樣子,那麼是的:你也需要單元測試這個方法,基本上重複你的測試工作。

但是,如果實現該功能使得一個方法簡單地調用另一個方法是有意義的,則可以使其他方法變爲虛擬。這將允許您創建一個特定於測試的子類,您只需驗證其他方法是否正確地調用了虛擬方法。

一旦由一個或多個單元測試驗證,你不需要任何進一步的測試方法,因爲現在你有證明,該方法正確調用的其他方法,你可以專注你的測試工作在那個方法上。

0

取決於您是否正在進行黑盒或白盒測試,以及如果您的應用程序正在使用這兩種方法的版本。

如果你假設你只是測試實現,那麼只需測試'主'版本就可以。如果你沿着測試筆者,只知道所提出的API(的javadoc或類似)的思路思考,那麼你需要僅基於API,這意味着完全測試兩種方法來測試。

如果你的應用程序只使用一個方法,然後棄用其他並創建一個版本條件測試時的方法已過時,在一些預先確定的版本仍然存在失敗。 IE:強制執行已棄用的方法在某個時候被刪除。