我上這是沒有考慮到測試寫的,並且不使用Spring遺留的Tomcat Web服務建立第一單元測試工作。我遇到的一個類是一個擴展HttpServlet的servlet。這是該課程的縮寫版本。如何在沒有(非默認)構造函數的Java類中模擬對象?
public class ItemServlet extends HttpServlet {
private ObjectMapper mapper;
private IItemDAO dao;
@Override
public void init() {
mapper = new ObjectMapper();
dao = new GenericItemDao(...);
}
}
通常我會通過外部依賴關係的構造,但servlet被通過Tomcat的基礎上,web.xml
配置,其只調用默認的構造函數和參數少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(https://github.com/jayway/powermock/wiki/MockConstructor)框架,你可以嘲笑ObjectMapper'的'的構造函數和'ItemDAO'類。參見實施例[這裏](https://stackoverflow.com/questions/26001713/how-do-you-mock-classes-that-are-used-in-a-service-that-youre-trying-to-unit- TE/26054804#26054804)。希望這可以幫助 – troig