【发布时间】:2016-01-15 15:06:55
【问题描述】:
我正在为遗留的 Tomcat Web 服务设置第一个单元测试,该服务没有考虑到测试,也没有使用 Spring。我遇到问题的类之一是扩展 HttpServlet 的 servlet。这是该类的缩写版本。
public class ItemServlet extends HttpServlet {
private ObjectMapper mapper;
private IItemDAO dao;
@Override
public void init() {
mapper = new ObjectMapper();
dao = new GenericItemDao(...);
}
}
通常我会将外部依赖项传递给构造函数,但 Tomcat 基于 web.xml 配置创建 servlet,它只调用默认构造函数和无参数的 init() 方法。结果,似乎没有任何方法可以进行依赖注入以允许我在单元测试中进行模拟。我能想到的唯一方法是创建一个仅用于测试的构造函数,我可以使用它从我的单元测试中实例化类,并将 init() 方法保留为实际应用程序调用的方式。我还可以创建第三个方法,可以由构造函数和init() 调用,如下所示:
public class ItemServlet extends HttpServlet {
private ObjectMapper mapper;
private IItemDAO dao;
public ItemServlet(ObjectMapper mapper, IItemDAO dao) {
initDependencies(mapper, dao);
}
private void initDependencies(ObjectMapper mapper, IItemDAO dao) {
this.mapper = mapper;
this.dao = dao;
}
@Override
public void init() {
initDependencies(new ObjectMapper(), new GenericItemDAO(...));
}
}
有没有更简洁的方法对这些类进行单元测试?
【问题讨论】:
-
如果你可以使用PowerMockito框架,你可以模拟
ObjectMapper和ItemDAO类的构造函数。请参阅示例here。希望这会有所帮助
标签: java unit-testing tomcat mocking