【问题标题】:Unit Testing Composite Service Methods单元测试复合服务方法
【发布时间】:2011-03-24 15:07:08
【问题描述】:

我正在为一个实现公开接口的类编写(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() 方法进行单元测试。我是否对 user/organization/defaultSettings 方法使用的所有下游资源调用使用模拟(使用 easymock/powermock)?似乎会有一种更清洁/更好/更简单的方法。

【问题讨论】:

    标签: java unit-testing junit easymock


    【解决方案1】:

    你可以用下面的形式写一个测试

    @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 逻辑的层,则可以对其进行模拟。正如您所提到的,如果您有很多依赖项,这可能会很痛苦。也许表明您需要更少的依赖? (也许这个类应该被分解成更小的单元?)

    【讨论】:

    • 我什至没有想过使用它。这几乎正​​是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多