我创建了一个新类,该类扩展了第三方抽象类。新类将调用抽象类中的方法。我遇到的问题是尝试编写单元测试时,我不确定如何编写测试,因为我不知道第三方类需要的确切细节。
下面的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 |
(我不知道上面的图表应该包含什么或看起来像什么)
一旦出现这种行为,然后进行测试以确保它相当简单。
祝您测试愉快!
利韦林