单元测试综合服务方法

时间:2011-03-24 15:07:09

标签: java unit-testing junit easymock

我正在编写(junit)一个类的单元测试,该类使用以下方法实现公开的接口:

public Set<Setting> getUserSettings();

public Set<Setting> getOrganizationSettings();

public Set<Setting> getDefaults();

public Set<Setting> getAllSettings();

从特定图层获取设置的方法可以从各个位置执行IO以检索其结果。 getAllSettings()返回所有级别的所有设置的单个集合,其中“最高”级别具有首选项(即,如果默认和用户级别中存在设置,则将使用用户级别中的设置。

我已经为getUserSettings(),getOrganizationSettings(),getDefaults()编写了单元测试,用Mocked对象模拟了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()方法进行单元测试。我是否对用户/组织/默认设置方法使用的所有下游资源调用使用模拟(使用easymock / powermock)?似乎会有更清洁/更好/更简单的方法来实现它。

1 个答案:

答案 0 :(得分: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逻辑的层,那么可以嘲笑它。如你所说,如果你有很多依赖,这可能会很痛苦。也许表明你需要更少的依赖? (例如,该类应该分解成更小的单元?)