无法使用 Mockito 模拟 MongoTemplateexecuteQuery

2024-04-27

我正在寻找模拟 MongoTemplate,以便可以实际调用我的服务中的executeQuery 函数。 这就是我的服务代码块的样子:

 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;
                }
            }

        });

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

@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() 显然没有做任何事情,我期望它触发实际的方法。


你需要使用Spy代替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 https://stackoverflow.com/questions/15052984/what-is-the-difference-between-mocking-and-spying-when-using-mockito

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 Mockito 模拟 MongoTemplateexecuteQuery 的相关文章

  • 如何用Java创建图像

    比如说在我的程序中 我有这个paint 方法 我的愿望是创建所绘制的矩形的图像 使用 for 循环 我尝试了下面的方法 它确实给了我那些矩形 蓝色 但背景是全黑的 当我运行程序而不创建图像 仅在 JFrame 上绘制矩形时 背景为白色 我怎
  • Jackson Json 将对象反序列化为列表

    我正在使用 Spring 的 Web 服务RestTemplate并反序列化Jackson 在来自服务器的 JSON 响应中 其中一个字段可以是对象或列表 这意味着它可以是 result or result 有没有办法通过对我要反序列化的类
  • GSON:自定义对象反序列化

    好吧 我编辑了这个问题 因为它不够清楚 Edit 2 更新了 JSON 文件 我在 Android 应用程序中使用 GSON 我需要解析来自服务器的 JSON 文件 而且有点太复杂了 我不想让我的对象结构太重 所以我想简化内容 所以我的对象
  • @NotNull.List 的目的

    当我查看标准时限制条件 http docs oracle com javaee 6 api javax validation constraints package summary html在 Bean Validation API JSR
  • 将 emoji 替换为适当的 java 代码

    我正在开发一个简单的java程序 它可以接受这样的字符串 停止 你违反了 法律 但是现在 你 并将每个表情符号替换为适当的 java 字符 我不知道该怎么称呼他们 这是一个例子 汽车表情符号 将替换为 uD83D uDE97 这允许我有一个
  • 在 javafx 中注册鼠标处理程序,但处理程序不是内联的

    我有一个 JavaFX 应用程序变得有点大 我想保持代码的可读性 我有一个折线图 我希望内置缩放功能 该功能在单击鼠标时发生 我知道我需要向图表注册鼠标侦听器 我无法从 Oracle 示例中弄清楚什么 即如下所示 http docs ora
  • 如何将 currentTimeMillis 转换为可读的日期格式? [复制]

    这个问题在这里已经有答案了 我想用currentTimeMillis两次 这样我就可以计算持续时间 但我也想以用户可读的格式显示时间和日期 我遇到了麻烦currentTimeMillis有利于计算 但我看不到内置函数可以转换为合适的时间或时
  • 在 Spring Security SAML 身份验证请求中配置 POST ProtocolBinding

    Spring Security SAML 坚持在 SAML 身份验证请求中请求 Artifact 绑定 ProtocolBinding 属性
  • 比较和删除列表和数组java中不存在的元素

    我有一个String数组和一List
  • 在 Java 中打开现有文件并关闭它。

    是否可以在java中打开一个文件附加数据并关闭多次 例如 psuedocode class variable declaration FileWriter writer1 new FileWriter filename fn1 writer
  • 日志记录在 Android 设备上实际上有什么作用?

    我一直在 Android 示例中看到这样的代码 try catch Exception e Log e Error e getMessage 什么是Log e实际上在物理设备上做什么 它进入系统日志 开发人员可以通过 SDK 工具访问该日志
  • 如何获取队列中的第 n 个项目?

    我的应用程序中有许多队列和优先级队列 我想轻松访问这些队列中的第 n 个项目 但没有看到使用 API 实现此目的的简单方法 我想我可以创建一个Iterator并迭代到第 n 个元素或使用toArray index 但似乎应该有一个更简单的方
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • HashSet 与 LinkedHashSet

    它们之间有什么区别 我知道 LinkedHashSet 是 HashSet 的有序版本 维护一个跨所有元素的双向链接列表 使用此类代替 HashSet 当您关心迭代顺序时 当你迭代 HashSet 时 顺序是不可预测的 而 LinkedHa
  • Spring Boot:在映射级别指定端口

    Spring Boot 我希望实现以下目标 一些 URL 路径映射到一个端口 一些映射到另一个端口 换句话说 我想要这样的东西 public class Controller1 RequestMapping value path1 port
  • 如何使用 Spring Resource.groovy 正确注入 Grails 服务

    使用 Grails 2 2 1 我定义了以下 Grails 服务 package poc class TestService def helperService class HelperService 我已经用过TestService如下
  • 根据 Java 环境变量中的值创建使用 @JsonIgnore 的自定义注释

    我需要创建一个新的注释 用于在环境变量设置时忽略输出 JSON 文件中的字段var false 我尝试使用JsonAnnotationIntrospector 但无法获得预期的输出 public class Vehicle String v
  • javafx中的stackpane和root有什么区别?

    我正在练习javafx做饼图 以下是开发饼图的代码 如果我这样做Group并与StackPane 我发现输出没有区别 我已经评论了组部分 只是徘徊两者之间的区别 import javafx application Application i
  • 在Java的System.out中以表格格式输出

    我正在从数据库获取结果 并希望将数据作为 Java 标准输出中的表输出 我尝试过使用 t 但我想要的第一列的长度变化很大 有没有办法将其显示在类似输出的漂亮表格中 Use System out format http java sun co

随机推荐

  • 是否有一个排序的java集合可以处理重复项?

    我需要一个行为类似于 C multimap 的集合 但我还需要能够通过一系列键获取元素 你可以看看谷歌收藏 http code google com p google collections 它有多种实现MultiMap
  • 泛型和实体框架:如何根据列值返回不同的类型

    我们有一个人员表 其中存储不同类型的人员 买方 卖方 代理人等 我们的 ORM 是实体框架 CodeFirst CTP5 我们使用存储库模式来实现良好的 TDD 和模拟 在 PersonRepository 中 我想返回特定类型 这样我就可
  • 如何为 64 位 Windows 编译现有的 posix 代码?

    我可以使用 Cygwin 或 MinGW 但我需要最终得到 64 位代码 而不是 32 位 这是因为我将从 64 位托管 C 调用 DLL 我似乎找不到关于设置这些工具来创建 64 位二进制文 件的良好参考 另外 如果 GCC 是版本 4
  • 将 jQuery 单击事件分配给正文中除少数 div 及其子元素之外的所有内容

    当我按下页面上的 div 时 会出现一个弹出窗口 当您再次单击该 div 时 弹出窗口就会消失 当您单击 div 外部时 弹出窗口就会消失 到目前为止一切看起来都很好 问题是 当我单击弹出窗口时 我希望弹出窗口及其子窗口可以单击 它们是无序
  • 在外语版本的 Excel 中从 vba 调用工作表函数

    以下代码片段在英语版本的 Excel 中运行正常 但是当尝试在葡萄牙语版本的 Excel 中的同一工作簿中运行此代码时 会出错 Add color bars on every other row attempt to make list e
  • 分面搜索的后过滤器和全局聚合之间有什么区别?

    搜索界面中的一个常见问题是您想要返回结果的选择 但可能想返回有关所有文档的信息 例如 我想查看所有红色衬衫 但想知道什么 其他颜色可供选择 这有时被称为 多面结果 或者 多面导航 这Elasticsearch 参考中的示例 https ww
  • “形式参数“foo”与多个参数匹配”-如何在 R 中处理这个问题?

    有时 调用带有某些参数的函数会导致错误消息formal argument foo matched by multiple actual arguments 是否可以打印不明确的实际参数列表 我问这个问题的原因是目前的问题plot类对象的函数
  • 使用导航控制器更改弹出窗口内容大小

    我想显示一个具有自定义内容大小的弹出窗口 我可以这样做 UINavigationController popoverContent UINavigationController alloc init UIView popoverView U
  • php 的问题:读取文件名,生成 javascript 和 html

    UPDATE 再一次问好 我发现自己遇到了一个新问题 php代码在我的PC wamp服务器 上完美运行 但我现在已将其上传到免费的网络主机服务器上 虽然php部分运行完美 它生成数组 但javascript函数本身不起作用 因为没有照片在网
  • 科尔多瓦闹钟

    我构建了一个带有计时器的 Cordova 闹钟应用程序 一切都运行良好 除了我现在想通过视觉和音频警报通知用户时钟到时 我使用了以下插件来进行本地通知 https github com katzer cordova plugin local
  • Alamofire 的响应序列化失败

    import UIKit import Alamofire import SwiftyJSON class LoginViewController UIViewController IBOutlet weak var urlTextFile
  • Visual Studio 2015 数据库项目目录包含扩展名为 jfm 的文件

    假设我们有一个数据库项目名为MyDatabase然后是一个名为MyDatabase jfm出现在项目的根目录中 当项目在 Visual Studio 中打开时 它会被独占锁定 它是一个二进制文件 它最近才开始出现 过去几天 我已经进行了谷歌
  • 合并 PDF,同时保留自定义页码(也称为页面标签)和书签

    我正在尝试自动合并多个 PDF 文件 并且有两个要求 a 现有书签和 b 需要保留页面标签 自定义页码 默认情况下 PyPDF2 和 pdftk 会在合并时保留书签 但 pdfrw 不会 PyPDF2 pdftk 或 pdfrw 中始终不保
  • 无法在Mac上安装qwt设计器插件

    我无法在 Mac 上安装 qwt 设计器插件 我已经下载了 v 6 1 3 并成功完成了 qmake make 和 sudo make install 问题是 在 usr local qwt 6 1 3 lib 下 我只有文件 qwt fr
  • 为什么同步上下文不适用于等待?

    这个答案 https stackoverflow com a 21839382 2631076 says 默认情况下 await 运算符将捕获当前 上下文 并使用它来恢复异步方法 我正在我的控制台应用程序中尝试此代码 static void
  • 初学者寻找漂亮且有指导性的 Python 代码 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 作为一个没有编程经验的初学者 我正在努力寻找漂亮的 Python 代码来学习和使用 请通过指向网站 书
  • 如何在应用程序启动时预加载 XAML?

    我有相当大的用户控件 它没有显示在主屏幕上 但用户几乎总是在以后使用它 第一次加载需要一些时间 解析 BAML 等 然后其他实例的构建速度相当快 问题是如何使其在启动屏幕期间在应用程序启动时预加载 我的想法是在启动时构建 usused 实例
  • 求矩阵任意子矩阵中的最大元素

    我给出一个矩阵N x M 对于长度的子矩阵X从位置开始 a b 我必须找到子矩阵中存在的最大元素 我的方法 按照问题说的做 简单2个循环 for i in range a a x for j in range b b x max max m
  • React-Navigation:从操​​作文件导航

    我是 RN 和 JS 的新手 我想在登录操作完成后进行导航 但无法使其工作 我正在使用 firebase 这是来自我的操作文件 它抛出一个 firebase 错误 export const LOGIN USER SUCCESS login
  • 无法使用 Mockito 模拟 MongoTemplateexecuteQuery

    我正在寻找模拟 MongoTemplate 以便可以实际调用我的服务中的executeQuery 函数 这就是我的服务代码块的样子 this mongoTemplate executeQuery query collectionName n