我正在使用Java 6和Mockito 1.8.5。我想嘲笑類的成員字段的方法,但我不知道如何。我有這些類...如何模擬類'member field的方法?
public class CacheService implements CacheCallback {
private final Cache cache;
...
public static CacheService getInstance() {
return INSTANCE;
}
private CacheService() {
cache = new DefaultCacheImpl();
}
public boolean saveNodes(final Map<Long, XmlNode> nodeMap) {
...
cache.saveNodes(nodeMap);
}
...
}
public class DefaultCacheImpl implements Cache {
...
public void saveNodes(Map<Long, XmlNode> xmlNodes) {
dao.updateDB(xmlNodes);
}
...
}
我想不出如何嘲笑「緩存」成員字段的方法「saveNodes」。我嘲笑下面的方法,但是由於在該領域的CacheService類沒有setter,我無法弄清楚如何注入我的模擬..
public class PopulateCacheServiceImpl extends RemoteServiceServlet implements PopulateCacheService {
...
public Boolean initCache() {
boolean ret = false;
try {
setupMocks();
CacheService.getInstance().startCache();
PopulateCache.addTestEntriesToCache();
ret = true;
} catch (Exception e) {
e.printStackTrace(System.err);
ret = false;
} // try
return ret;
} // initCache
private void setupMocks() {
DefaultCacheImpl cache = mock(DefaultCacheImpl.class);
doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws Throwable {
return null;
}
}).when(cache).saveNodes(Matchers.anyMap());
} // setupMocks
}
是否有任何其他的方式來做到這一點與Mockito?謝謝, - 戴夫
感謝這一點,但CacheService是一個單身人士,目前有一個私人的構造函數。我可以更改源代碼,但我仍然希望只有一個CacheService類的實例在jvm上浮動。 – Dave 2012-02-13 17:12:18
@Dave你應該認真考慮避免對'CacheService.getInstance()'這個靜態依賴,並使用適當的DI,所以你不必在這裏和那裏破解一些東西來測試。你的設計也會更清潔和優雅。 – Brice 2012-02-13 18:14:54
我接受你的意見,但我們的項目禁止使用第三方工具(如Spring)作爲核心項目(用於測試它的罰款)。我無法對抗我公司的政策。我如何設置DI,記住,我只想在JVM中使用CacheService對象的一個實例? – Dave 2012-02-13 18:39:20