无法使用 Mockito 模拟 MongoTemplate executeQuery [英] Unable to mock MongoTemplate executeQuery using Mockito
本文介绍了无法使用 Mockito 模拟 MongoTemplate executeQuery的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望模拟 MongoTemplate,以便可以实际调用我服务中的 executeQuery 函数.这是我的服务代码块的样子:
I'm looking to mock MongoTemplate, so that the executeQuery function in my service can be actually get called. This is how my service code block looks like:
this.mongoTemplate.executeQuery(query, collectionName, new DocumentCallbackHandler() {
@Override
public void processDocument(Document document) throws MongoException, DataAccessException {
try {
// convert to strongly typed object
System.out.println("Actual method called");
ProductDayData pdd = mongoTemplate.getConverter().read(ProductDayData.class, document);
// call copyover
backFillOneEvent(pdd, liveContractIds, pddType, toDate, now, timeAtStartOfDay);
} catch (RuntimeException e) {
LOGGER.error("FATAL: backfill - error processing document: {}", document, e);
} catch (Throwable t) {
LOGGER.error("FATAL: backfill - error processing document: {}", document, t);
throw t;
}
}
});
在我的单元测试中,这就是我所做的:
In my unit test, this is what I've done:
@Mock
private MongoTemplate mongoTemplate;
service = new MyService(mongoTemplate); //mock is set
Mockito.doCallRealMethod().when(mongoTemplate).executeQuery(Mockito.any(Query.class),Mockito.any(String.class),Mockito.any(DocumentCallbackHandler.class));
doCallRealMethod() 显然没有做任何事情,我希望它触发实际的方法.
The doCallRealMethod() apparently doesn't do anything, I expected it to trigger the actual method.
推荐答案
您需要使用 Spy
而不是 Mock
.
You need to use Spy
instead of Mock
.
MongoTemplate mongoTemplate = Mockito.spy(
//Instance the MongoTemplate, use any test framework
new MongoTemplate(new SimpleMongoClientDbFactory("mongodb://localhost/test"))
);
// Since it's spy, by default, it will execute real method
//Skipping stub Mockito.doCallRealMethod()....
System.out.println("Real");
mongoTemplate.executeQuery(query, collectionName, new DocumentCallbackHandler() {
@Override
public void processDocument(Document document) throws MongoException, DataAccessException {
//Simplified version
System.out.println("Actual method called:" + document.toJson());
}
});
System.out.println("End Real");
//Now call fake `executeQuery`
Mockito.doNothing().when(mongoTemplate).executeQuery(Mockito.any(Query.class), Mockito.any(String.class),
Mockito.any(DocumentCallbackHandler.class));
System.out.println("Mock");
mongoTemplate.executeQuery(query, collectionName, new DocumentCallbackHandler() {
@Override
public void processDocument(Document document) throws MongoException, DataAccessException {
//Simplified version
System.out.println("Actual method called:" + document.toJson());
}
});
System.out.println("End Mock");
//Now we "enable" real method call
Mockito.doCallRealMethod().when(mongoTemplate).executeQuery(Mockito.any(Query.class), Mockito.any(String.class),
Mockito.any(DocumentCallbackHandler.class));
System.out.println("Real 2");
mongoTemplate.executeQuery(query, collectionName, new DocumentCallbackHandler() {
@Override
public void processDocument(Document document) throws MongoException, DataAccessException {
System.out.println("Actual method called:" + document.toJson());
}
});
System.out.println("End Real 2");
--输出---
Real
//MongoDB traces...
Actual method called:{...}
Actual method called:{...}
...
End Real
Mock
End Mock
Real 2
//MongoDB traces...
Actual method called:{...}
Actual method called:{...}
...
End Real 2
Links: @Mock
vs @Spy
这篇关于无法使用 Mockito 模拟 MongoTemplate executeQuery的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文