如何使用mockito模拟void方法并保持其他所有方法不变



我正在使用Mockito,希望能做一件简单的事情。如何模拟特定类的void方法?我试过了。。。

    CacheService cs = mock(CacheService.class);
    when(cs.startCache()).then( PopulateCache.addTestEntriesToCache() );

但是我得到了编译错误

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:testCompile (default-testCompile) on project cme-productplus-web: Compilation failure: Compilation failure:
[ERROR] Documents and SettingsE18538workspacecme-productplus-websrctestjavacomcmeclearingproductserverPopulateCacheServiceImpl.java:[32,65] 'void' type not allowed here
[ERROR] Documents and SettingsE18538workspacecme-productplus-websrctestjavacomcmeclearingproductserverPopulateCacheServiceImpl.java:[32,20] 'void' type not allowed here

我的目的不是调用CacheService.startCache的普通代码,而是调用我自己的方法"PopulateCache.addTestEntriesToCache()"。我该怎么做?

编辑:根据给出的响应,我尝试编辑实现mock的类,但mock方法(可能是doAnswer)没有被调用。。。

public class PopulateCacheServiceImpl extends RemoteServiceServlet implements PopulateCacheService {
/**
 * 
 */
private static final long serialVersionUID = 1L;
public Boolean initCache() { 
    boolean ret = false;
    try {
        setupMockCache();
        CacheService.getInstance().startCache();
        ret = true;
    } catch (Exception e) {
        e.printStackTrace(System.err);
        ret = false;
    }   // try
    return ret;
}   // initCache
private void setupMockCache() { 
    CacheService cs = mock(CacheService.class);
    try {
        doAnswer(new Answer<Object>() {
            public Object answer(InvocationOnMock invocation) throws Throwable {
                PopulateCache.addTestEntriesToCache();
                return null;  
            }
        }).when(cs).startCache();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}   // setupMockCache 
}

谢谢,-Dave

您正在为CacheService制作一个mock,但仍然没有返回它并在任何地方使用它。相反,您调用的是真正的静态CacheService.instance()方法,该方法不会返回mock。让您setupMockCache()返回CacheService并直接使用它,而不是通过instance()方法。

同样在问题标题/摘要中,你说"保持其他一切不变"。如果您的意思是希望CacheService的其余部分的行为与正常情况相同,那么也许您想要一个部分mock,您可以使用Mockito的spy()而不是mock()。

将对缓存的调用放入http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#12

    Mockito.doAnswer(new Answer<Object>() {
        public Object answer(InvocationOnMock invocation) throws Throwable {
            PopulateCache.addTestEntriesToCache()
            return null;  
        }
    }).when(cs).startCache();

当然,它不起作用:在setupMockCache中,您正在创建一个缓存模拟CacheService cs = mock(CacheService.class);,在其上定义存根。但是cs实例永远不会被传递。在initCache中,你正在调用setup方法,但你没有得到CacheService实例,就在你写了这个语句CacheService.getInstance().startCache();之后,它肯定会创建一个真正的CacheService实例,当然它不会使用模拟实例。

我不知道你想做什么,在你的生产代码中部分模拟Cache似乎很奇怪,也是错误的!如果我是你,我会创建自己的一组类,如果需要,这些类将返回由继承的CacheService类支持的自定义缓存(该类将显式覆盖startCache方法)。

希望能有所帮助!

相关内容

  • 没有找到相关文章

最新更新