我正在使用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()而不是嘲笑()进行.