2011-03-24 119 views
4

我寫這與類似的方法實現了暴露接口的類(JUnit的)單元測試:單元測試綜合服務方法

public Set<Setting> getUserSettings(); 

public Set<Setting> getOrganizationSettings(); 

public Set<Setting> getDefaults(); 

public Set<Setting> getAllSettings(); 

從特定層獲得設置的方法做IO從不同的地方檢索他們的結果。 getAllSettings()返回所有級別的所有設置的單個集合,其中「最高」級別具有首選項(即,如果設置存在於默認級別和用戶級別中,則將使用用戶級別的設置。

我已經寫了單元測試getUserSettings(),getOrganizationSettings()的getDefaults(),嘲諷了與嘲笑對象的IO操作。

實現了getAllSettings()看起來像

public Set<Setting> getAllSettings(){ 
    Set<Setting> defaults = getUserSettings(); 
    Set<Setting> custom = getOrganizationSettings(); 
    Set<Setting> undefined = getDefaults(); 
    //perform some sorting and business logic 
    //return fully sorted set 

} 

我的問題在於如何單元測試getAllSettings()方法。我使用mocks(使用easymock/powerm ock)用戶/組織/ defaultSettings方法使用的所有下游資源調用?似乎有一個更清潔/更好/更簡單的方法來做到這一點。

回答

5

你可以在下面的形式寫一個測試

@Test 
public void testGetAllSettings() { 
    Foo fixture = new Foo() { 
     public Set<Setting> getUserSettings() { // canned impl } 
     public Set<Setting> getOrganizationSettings() { // canned impl } 
     public Set<Setting> getDefaults() { // canned impl } 
    } 

    Assert.assertEquals(whatEverItShouldEqual, fixture.getAllSettings()); 
} 

這將允許您測試獲得獨立的其他方法的所有設置,邏輯。

另一種選擇是嘲笑這些方法的IO。如果你有一個能夠執行IO邏輯的層,那麼可能會被嘲笑。正如你所提到的,如果你有很多依賴關係,這可能是一個痛苦。也許是你需要更少依賴的標誌? (也許這個班級應該分解成更小的單位,例如?)

+1

我什至沒有想到使用它。這正是我所期待的。 – BuffaloBuffalo 2011-03-24 17:28:04