簡體   English   中英

如何模擬類成員字段的方法?

[英]How do I mock a method of a class' member field?

我正在使用Java 6和Mockito 1.8.5。 我想模擬一個類'成員字段的方法,但我無法弄清楚如何。 我有這些課......

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有沒有其他方法可以做到這一點? 謝謝, - 戴夫

問題出在這一行:

cache = new DefaultCacheImpl();

如果在CacheService中構造一個緩存對象,它們是緊密耦合的。 您不能將CacheService與另一個緩存實現一起使用。

相反,將緩存實現傳遞給構造函數:

public CacheService(Cache cacheImpl) {
    this.cache = cacheImpl;
}

這允許CacheService使用任何Cache實現。

如何制作兩個構造函數? 你擁有的那個會留在那里。 另一個允許您傳遞Cache實現並允許您測試該類。 新構造函數可以具有受保護的訪問權限,以限制哪些類可以使用它。

如果您可以更改源,請對這些類進行decopule。 擺脫cache = new DefaultCacheImpl(); 來自Sjoerd建議的構造函數。

如果你不能 - 使用PowerMock來模擬 DefaultCacheImpl 的構造函數 我必須說這是一個非常丑陋的解決方案(唯一丑陋的是模擬靜態初始化代碼)。

注意:您的代碼是對流行問題“為什么我需要依賴注入?”的回答。 我認為人們在發明DI時會看到這樣的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM