java-我该如何模拟void方法,并使用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-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()”.我怎样才能做到这一点?

编辑:根据给出的响应,我尝试在实现模拟的地方编辑类,但没有调用模拟方法(可能是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 

}

谢谢-戴夫

解决方法:

您正在为CacheService做模拟,但仍未返回它并在任何地方使用它.相反,您正在调用真正的静态CacheService.instance()方法,该方法不会返回您的模拟.让您setupMockCache()返回CacheService并直接使用它,而不用通过instance()方法.

同样在问题标题/摘要中,您说的是“其他内容保持不变”.如果您想让CacheService的其余部分正常运行,则可能需要部分模拟,可以使用Mockito的spy()而不是嘲笑()进行.

上一篇:java-Mockito验证方法未检测到方法调用


下一篇:禁用测试中的Dagger注入