Java 如何使用mockito模拟一个void方法并保持其他一切不变?

Java 如何使用mockito模拟一个void方法并保持其他一切不变?,java,mocking,mockito,Java,Mocking,Mockito,我正在使用Mockito,希望做一件简单的事情。如何模拟特定类的void方法?我试过 CacheService cs = mock(CacheService.class); when(cs.startCache()).then( PopulateCache.addTestEntriesToCache() ); 但是我得到了编译错误 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plu

我正在使用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 Settings\E18538\workspace\cme-productplus-web\src\test\java\com\cme\clearing\product\server\PopulateCacheServiceImpl.java:[32,65] 'void' type not allowed here
[ERROR] \Documents and Settings\E18538\workspace\cme-productplus-web\src\test\java\com\cme\clearing\product\server\PopulateCacheServiceImpl.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 

}
公共类PopulateCacheServiceImpl扩展RemoteServiceServlet实现PopulateCacheService{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
公共布尔initCache(){
布尔ret=false;
试一试{
setupMockCache();
CacheService.getInstance().startCache();
ret=真;
}捕获(例外e){
e、 printStackTrace(System.err);
ret=假;
}//试试看
返回ret;
}//初始化缓存
私有void setupMockCache(){
CacheService cs=mock(CacheService.class);
试一试{
doAnswer(新答案){
公共对象应答(InvocationMock调用)抛出Throwable{
PopulateCache.addTestEntriesToCache();
返回null;
}
}).when(cs.startCache();
}捕获(SQLE异常){
e、 printStackTrace();
}
}//setupMockCache
}

谢谢,-Dave

将对缓存的调用放在本例的anwser方法中

Mockito.doAnswer(新答案(){
公共对象应答(InvocationMock调用)抛出Throwable{
PopulateCache.addTestEntriesToCache()的
返回null;
}
}).when(cs.startCache();

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


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

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

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


希望有帮助

可能重复“Nya-Nya-Nya,你是一个void方法!”谢谢你的回答,但是即使有了这段代码,我试图模拟的void方法也没有被调用,正如我通过调试验证的那样。我还缺什么吗?我在上面包含了我的代码。
    Mockito.doAnswer(new Answer<Object>() {
        public Object answer(InvocationOnMock invocation) throws Throwable {
            PopulateCache.addTestEntriesToCache()
            return null;  
        }
    }).when(cs).startCache();