2010-08-12 76 views
1

要在下面的ClassA中測試方法doSomething(String name),應該測試什麼東西的返回值?單元測試應該有多徹底?

我首先想到的是測試

  1. name屬性設置正確的包裝
  2. ,關於包裝的formattedName屬性的格式正確

但轉念一想,我應該而是在單元測試中爲UtilClass.format(String name)測試formattedName的值?或者我應該在兩個地方做?

public class ClassA { 
    public Wrapper doSomething(String name) { 
    Wrapper wrapper = new Wrapper(); 
    wrapper.setName(name); 

    wrapper.setFormattedName(UtilClass.format(name)); 

    return wrapper; 
    } 
} 

回答

0

我會有驗證名稱和格式化名稱具有適當的值的測試。爲了從UtilClass中解耦該方法,我會使用注入並使用模擬驗證UtilClass.format方法被調用。您對格式化名稱的測試,然後會檢查該值是否等於從您的模擬中返回的結果。我也可能(可能是第一次寫測試)一個測試,驗證當你調用該方法時你得到一個非空結果。單獨測試UtilClass方法。

編輯:我同意@Bill K,你應該首先寫測試。

+0

我沒有考慮嘲笑UtilClass。感謝這個想法。 – gangsta 2010-08-14 05:18:58

2

測試,第一種方法是有趣的,它說,直到你有一個失敗的測試不寫一行代碼 - 那麼只有編寫足夠的代碼,使您的測試通過。

如果你遵循這個計劃,你最終會得到一些相當徹底的測試。

+0

+1:我可以寫完全一樣的東西,它對我來說效果很好。一些補充答案。當TDD「編寫最簡單的測試應該失敗」時,我遵循的另一個規則是,如果你不遵循這個規則,風險是在同一個測試中測試多個特性,這也是一個規則「每個單元測試應該只測試一件事」 。 – kriss 2010-08-12 20:56:07

+0

所有非常好的評論,謝謝。大部分我都同意第一種測試方法。目前,我們正在盡最大努力通過單元測試來加強我們的遺留代碼。 – gangsta 2010-08-14 05:09:30

0

由於UtilClass有一個format方法,你應該在該類的單元測試的一部分進行測試。

你正在測試的Wrapper類應該是確保它不會以任何方式修改數據,當然這是它的目的。如果它的目的是修改數據,那麼你應該測試它。

0

你既然知道編寫單元測試時,要測試的方法的內部,你有你需要有方法本身是什麼:

  1. 測試參數(如果名稱 是空會發生什麼字符串?還是一個很長的字符串 ?)

  2. 測試返回值/對象 (測試,以確保這個方法是不是 返回一個空引用)

  3. 測試 方法中正在修改的數據(調用getName並驗證它是否正確設置了 ,並且還調用 getFormattedName以驗證此數據 )。

這些只是一些初始想法,讓你開始你應該測試的東西。

要回答你的第二個問題,我認爲你應該在Wrapper本身的單元測試中測試getFormattedName方法。這樣,如果將來Wrapper類或getFormattedName方法發生更改,並且需要更新單元測試,則只需在一個位置(在Wrapper單元測試中)對其進行跟蹤。

0

我喜歡做黑盒單元測試。因此,在這種情況下,我會測試返回時「做某事」的含義。如果它意味着它的名字應該被設置和格式化,那麼我會測試它。

我還會用空字符串和空字符串作爲基本情況進行測試。