我创建了一个新类,该类扩展了第三方抽象类。新类将调用抽象类中的方法。我遇到的问题是尝试编写单元测试时,我不确定如何编写测试,因为我不知道第三方类需要的确切细节。

下面的AbstractDecoratorMapper是特定于SiteMesh的类,为了使SiteMesh正常工作,我必须对其进行扩展。据我从文档中得知,我不能使用合成。

public final class PartnerDecoratorMapper extends AbstractDecoratorMapper {

    @Override
    public void init(Config config, Properties properties, DecoratorMapper parent) throws InstantiationException {
        super.init(config, properties, parent);
    }

    @Override
    public Decorator getDecorator(HttpServletRequest request, Page page) {
        if (super.getDecorator(request, page).getName().equalsIgnoreCase("default")) {
            return getNamedDecorator(request, "externalPartnerDefault");
        }
        return super.getDecorator(request, page);
    }
}

如果此工具有任何帮助,我可以使用JMock。

最佳答案

您可能要问两件事。我会尽力回答这两个问题。

可能的问题1)我如何测试我的附加功能?

可能的问题2)我如何测试组合功能是否合适?

让我从Question1开始。

我建议简单的剥皮。这里有一个有关该技术的视频:http://www.youtube.com/watch?v=p0tILwRZH5Q
(视频是C#,但在Java中基本相同)

这意味着您之后将拥有以下代码

@Override
public Decorator getDecorator(HttpServletRequest request, Page page) {
    Decorator d = super.getDecorator(request, page);
    return getResolvedDecorator(d, d.getName(), request);

}
public Decorator getResolvedDecorator(Decorator current, String name, HttpServletRequest request) {
    if (name.equalsIgnoreCase("default")) {
        return getNamedDecorator(request, "externalPartnerDefault");
    }
    return current;
}

现在,您可以通过类似的电话进行测试
assertEquals(expected, new PartnerDecoratorMapper().getResolvedDecorator(null, "default", MockHttpServletRequest);

我建议也可以从HttpServletRequest中删除数据,以使测试和意图更加清晰。

注意:这具有附加的性能优势,因为对结果进行了缓存,因此对super.getDecorator()的调用仅发生一次。

附加说明:还值得注意的是,不需要init()的覆盖,并且实际上不执行任何操作。

问题2:这是一个很难回答的问题,因为您没有说明所需的行为是什么。
我假设这是一种工厂模式,所以很可能它会以某种方式工作,例如

| http请求质量1 |页面质量1 |预期的装饰器|
|/mypath/mypage |状态= foo | MyDecorator |

(我不知道上面的图表应该包含什么或看起来像什么)
一旦出现这种行为,然后进行测试以确保它相当简单。

祝您测试愉快!
利韦林

09-11 18:54
查看更多