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。
您可能会问两件事。我会尽力回答这两个问题。
可能的问题 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 | 我的装饰器 |
(我不知道上面的图表应该包含什么或看起来像什么)一旦你有这种行为,那么测试以确保它会相当简单。
快乐测试,卢埃林