首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用Mockito模拟MongoTemplate executeQuery

无法使用Mockito模拟MongoTemplate executeQuery
EN

Stack Overflow用户
提问于 2020-06-15 16:08:42
回答 1查看 2.3K关注 0票数 2

我希望模拟MongoTemplate,这样我的服务中的executeQuery函数就可以被实际调用。这是我的服务代码块的样子:

代码语言:javascript
复制
 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;
                }
            }

        });

在我的单元测试中,我是这样做的:

代码语言:javascript
复制
@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()显然没有做任何事情,我以为它会触发实际的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-15 21:01:58

您需要使用Spy而不是Mock

代码语言:javascript
复制
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");

--输出--

代码语言:javascript
复制
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

链接:@Mock vs @Spy

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62383977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档