2011-03-24 120 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