如何对扩展/继承第 3 方类的类进行单元测试

Ily*_*tel 5 java unit-testing sitemesh jmock

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

下面的 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

lle*_*lco 2

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

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

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

让我从问题1开始。

我建议使用简单的果皮。这里有一个关于该技术的视频: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;
}
Run Code Online (Sandbox Code Playgroud)

现在你可以通过像这样的调用来测试它

assertEquals(expected, new PartnerDecoratorMapper().getResolvedDecorator(null, "default", MockHttpServletRequest);
Run Code Online (Sandbox Code Playgroud)

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

注意:这具有额外的性能优势,因为结果被缓存,所以对 super.getDecorator() 的调用仅发生一次。

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

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

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

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

快乐测试,卢埃林