Mockito Matchers isA、any、eq 和 Same 之间有什么区别?

2024-01-25

我对它们之间的区别以及在哪种情况下选择哪一个感到困惑。有些差异可能很明显,例如any and eq,但我将它们全部包括在内只是为了确定。

我想知道它们的差异,因为我遇到了这个问题: 我在 Controller 类中有这个 POST 方法

public Response doSomething(@ResponseBody Request request) {
    return someService.doSomething(request);
}

并想对该控制器执行单元测试。 我有两个版本。第一个是简单的,像这样

@Test
public void testDoSomething() {
    //initialize ObjectMapper mapper
    //initialize Request req and Response res
    
    when(someServiceMock.doSomething(req)).thenReturn(res);

    Response actualRes = someController.doSomething(req);
    assertThat(actualRes, is(res));
}

但我想使用 MockMvc 方法,就像这样

@Test
public void testDoSomething() {
    //initialize ObjectMapper mapper
    //initialize Request req and Response res
    
    when(someServiceMock.doSomething(any(Request.class))).thenReturn(res);

    mockMvc.perform(post("/do/something")
            .contentType(MediaType.APPLICATION_JSON)
            .content(mapper.writeValueAsString(req))
    )
            .andExpect(status().isOk())
            .andExpect(jsonPath("$message", is("done")));
}

两者都运作良好。但我想要我的someServiceMock.doSomething()在MockMvc方法中接收req,或者至少一个具有相同变量值的对象req(不只是任何Request类),然后返回res,就像第一个一样。我知道使用 MockMvc 方法是不可能的(或者是吗?),因为实际调用中传递的对象始终与模拟中传递的对象不同。无论如何我可以实现这一目标吗?或者说这样做是否有意义?或者我应该满意地使用any(Request.class)?我试过了eq, same,但都失败了。


  • any() https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentMatchers.html#any--绝对没有检查任何内容。从 Mockito 2.0 开始,any(T.class) https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentMatchers.html#any-java.lang.Class- shares isA语义上的意思是“任何T“或正确地”任何类型的实例T".

    与 Mockito 1.x 相比,这是一个变化 https://stackoverflow.com/posts/comments/55631479, where any(T.class) https://javadoc.io/doc/org.mockito/mockito-core/1.10.19/org/mockito/Matchers.html在 Java 8 之前,除了保存强制类型转换外,什么也没检查:“任何类型的对象,不是给定类所必需的。提供类参数只是为了避免强制转换。”

  • isA(T.class) https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentMatchers.html#isA-java.lang.Class-检查参数instanceof T,暗示它是非空的。

  • same(obj) https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentMatchers.html#same-T-检查参数是否引用相同的实例obj,使得arg == obj是真的。

  • eq(obj) https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentMatchers.html#eq-T-检查参数是否等于obj根据其equals方法。如果您传递实际值而不使用匹配器,这也是行为。

    请注意,除非equals被覆盖,您将看到默认的 Object.equals 实现,其行为与same(obj).

如果您需要更精确的自定义,您可以为您自己的谓词使用适配器:

  • 对于 Mockito 1.x,使用argThat https://javadoc.io/doc/org.mockito/mockito-core/1.10.19/org/mockito/Matchers.html带有定制的 HamcrestMatcher<T>准确选择您需要的对象。
  • 对于 Mockito 2.0 及更高版本,请使用Matchers.argThat https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentMatchers.html#argThat-org.mockito.ArgumentMatcher-与定制org.mockito.ArgumentMatcher<T>, or MockitoHamcrest.argThat https://site.mockito.org/javadoc/current/org/mockito/hamcrest/MockitoHamcrest.html#argThat(org.hamcrest.Matcher)带有定制的 HamcrestMatcher<T>.

您还可以使用refEq https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentMatchers.html#refEq-T-java.lang.String...-,它使用反射确认对象相等; Hamcrest 有类似的实现属性值相同 http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/beans/SamePropertyValuesAs.html对于公共 bean 风格的属性。请注意,在 GitHub 上问题#1800建议弃用和删除refEq https://github.com/mockito/mockito/issues/1800,正如在那一期中,您可能更喜欢eq更好地让你的班级更好地封装他们的平等感。

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

Mockito Matchers isA、any、eq 和 Same 之间有什么区别? 的相关文章

随机推荐

  • Firefox 和 Chrome 中的文本区域填充不一致

    我的文本区域元素上有填充 我希望当您在文本区域内滚动时内容保持填充状态 它在 Firefox 中按预期工作 但在 Chrome 中却不然 下图显示了输出的差异 CSS textarea width 250px height 160px pa
  • 在 C++ 中计算字符串的算术表达式[重复]

    这个问题在这里已经有答案了 我正在寻找一种简单的方法来计算字符串中的简单数学表达式 如下所示 3 2 4 1 4 9 6 我只是想 and 运营加 and 迹象 和 优先级高于 可以尝试一下 http partow net programm
  • 为什么 CV::Mat 图像的颜色空间错误(GBR 而不是 RGB 或 BGR)?

    我有一个 Python 模块 它将 RGB 发送到 C 并在那里被消耗 然而 无论我做什么 图像都有错误的色彩空间 那是我试图将其转换为RGB 假设它仍然在 BGR 中 尽管在 python 中它故意通过执行以下操作转换为 RGB retu
  • 在 C# 中使用反应式扩展时如何显示进度

    我在 C 中使用反应式扩展来执行一些计算 这是我的代码到目前为止的样子 我尝试将代码包装起来 以便在计算方法中执行一系列任务时可以显示进度 这是可观察到的 IObservable
  • LINQ 表达式语法如何与 Include() 一起使用以进行预加载

    我在下面有一个查询 但我想执行 Include 来急切加载属性 Actions 有一个导航属性 User Action User 1 我的基本查询 from a in Actions join u in Users on a UserId
  • 在使用 SQL Server 数据库邮件创建的电子邮件中嵌入图像

    我正在仅在 SQL Server 中开发电子邮件解决方案 该解决方案将使用数据库邮件发送 HTML 格式的电子邮件 问题是 HTML 中的图像需要嵌入到外发电子邮件中 如果我使用 net 应用程序来生成和发送电子邮件 这不会成为问题 但不幸
  • 用于验证带扩展名的 Windows 和 Linux 路径的正则表达式

    我正在尝试编写一个函数 该函数将验证给定路径在带有文件扩展名的 Linux Windows 中是否有效 ex Windows路径 D DATA My Project 01 07 03 061418738709443 docLinux路径 s
  • PHP 中的文件夹作为参数

    我想创建一个脚本 将网站中请求的每个文件夹作为参数传递 例如 如果有人请求 www example com foo 这将被重定向到主index php并作为参数传递 在请求时得到相同的结果www example com index php
  • Java中如何实现并发读取映射到内存的文件?

    我有很多线程同时读取同一个文件 总共大约100M 并且只有一个线程更新文件 我想将文件映射到内存中以减少FILE I O 在 Java 中如何做到这一点 我基本上考虑了以下2种方法 用字节数组存储文件 多线程读取时每次创建ByteArray
  • 为什么 CarPlay 在真车上会崩溃?

    我有一个音频应用程序并已实现 CarPlay 我已按照本指南添加 CarPlay 支持 https blog fethica com add carplay support to swiftradio https blog fethica
  • 您在开发中如何处理 SSL?

    我有一个应用程序 它的一些路由与ssl 要求 http github com rails ssl requirement插入 它已部署并且在生产中运行良好 问题是如何在开发中最好地处理这个问题 因为目前我只是简单地破解我的routes rb
  • 使用php从h1标签获取所有值

    我想接收一个包含文本中所有 h1 标签值的数组 例如 如果给定的输入字符串 h1 hello h1 p random text p h1 title number two h1 我需要接收一个包含以下内容的数组 titles 0 hello
  • SQL Reporting Services - Mozilla 中未显示打印按钮

    我在用SQL 报告服务 它工作正常并显示打印按钮IE 但在 Mozilla Firefox 中未显示 有人有什么主意吗 我已经检查过这个解决方案 但它不起作用 http social msdn microsoft com Forums en
  • 网络直径是什么意思?

    上图所示这个链接 http en wikipedia org wiki Vertex 28graph theory 29的 具有 6 个顶点和 7 个边的图 其中最左侧的 6 号顶点是叶顶点或下垂顶点 有直径4吗 对还是错 定义是 图的直径
  • Sequelize关系查询返回重复数据

    我正在使用 Sequelize 关系查询指定客户的客户订单 index js var results2 await customerService getOrders 1 console log results2 服务 js exports
  • Firefox 中的大子字符串比 Chrome 快约 9000 倍:为什么?

    基准 http jsperf com substringing http jsperf com substringing 因此 我正在启动我的第一个基于 HTML5 浏览器的客户端项目 本质上 它必须将非常非常大的文本文件解析为一个或多个对
  • 同时使用 INADDR_ANY 和特定 IP 绑定到同一端口

    python 中的一个简单实验 在 Windows 上 表明我能够同时绑定到通配符地址和特定地址上的同一端口 import socket import select MY PORT 13337 sany socket socket sany
  • 使用 Contains 方法检查 List 中的 float 时的 C# 准确性

    我有一个清单floats 并想要检查它是否已经包含特定值List Contains 方法 我知道对于float您经常无法使用的相等性测试 但类似的东西myFloat value lt 0 001 我的问题是 Contains方法说明了这一点
  • VB.NET 中的递归文件搜索

    我有一个函数可以对文件进行递归目录搜索 但是当我搜索驱动器时 我收到访问被拒绝错误 从而停止搜索 我怎样才能避免这些错误 这是我使用的函数 lstSearch GetFilesRecursive FolderBrowserDialogMai
  • Mockito Matchers isA、any、eq 和 Same 之间有什么区别?

    我对它们之间的区别以及在哪种情况下选择哪一个感到困惑 有些差异可能很明显 例如any and eq 但我将它们全部包括在内只是为了确定 我想知道它们的差异 因为我遇到了这个问题 我在 Controller 类中有这个 POST 方法 pub