当前位置: 首页 > 知识库问答 >
问题:

为什么在Mockito中无法同时使用Mather和值参数[重复]

邢勇
2023-03-14

莫奇托官方文件说:

警告:

如果使用参数匹配器,则所有参数都必须由匹配器提供。

例如:(示例显示验证,但同样适用于存根):

verify(mock).someMethod(anyInt(), anyString(), eq("third argument"));
//above is correct - eq() is also an argument matcher

verify(mock).someMethod(anyInt(), anyString(), "third argument");
//above is incorrect - exception will be thrown because third argument is given without argument matcher. 

匹配器方法(如anyObject()eq())不返回匹配器。在内部,它们在堆栈上记录一个匹配器并返回一个伪值(通常为空)。

我很好奇为什么即使任何类似(的方法返回null,也无法在值旁边使用Mathers

共有2个答案

苏鸿志
2023-03-14

一个很好的猜测是,mockito需要为正在进行的存根中的所有参数找到参数匹配器。在 ArgumentMatcherStorageImpl#validateState() 中为每个方法参数查找匹配器。

赏梓
2023-03-14

留档说

像anyObject(),eq()这样的匹配器方法不返回匹配器。在内部,它们在堆栈上记录匹配器并返回虚拟值(通常为 null)。此实现是由于 java 编译器施加的静态类型安全性。结果是你不能在验证/存根方法之外使用 anyObject()、eq() 方法。

Mockito依靠这种可以说是黑色魔法。如果您能够传递对象,Mockito必须能够理解null何时是实际参数,何时是匹配器调用。基本上,这两种情况是无法区分的(我认为):

verify(mock).someMethod(anyInt(), anyString(), null);
verify(mock).someMethod(anyInt(), null, anyString());
 类似资料:
  • 问题内容: 我必须获得一个字符串输入和一个整数输入,但是输入的顺序应该是整数首先出现,然后应该要求用户输入字符串 上面的代码工作正常,但是如果我先接受整数输入,如下面的代码 然后抛出java.lang.ArrayIndexOutOfBoundsException。 这是我的源文件的完整代码: 公共类StringSwap { } 请指出我在这里做错了什么。 问题答案: 问题是整数后面的字符。当您调用

  • 问题内容: 我是Mockito的新手,我已经开始学习它。但是我有一些疑问。为什么我们需要使用Mockito?据我所知,它用于模拟(创建虚拟对象)并在具有实际运行代码之前编写测试用例。但是,如果我想测试已经实施的代码以检查它们是否正常运行,该怎么办。我如何使用Mockito进行测试? 例如,我有CRUD方法,我想通过使用我的Create方法在数据库中实际插入数据来测试Create是否正常运行,这与其

  • 为什么mockito打电话为存根方法。 为什么它使一个实际调用func下当... then返回我已经检查了当做调试。

  • 问题内容: 我的问题是为什么python为什么同时使用引用计数和gc的标记和清除?为什么不只是标记和扫描? 我最初的猜测是,使用引用计数可以轻松删除非循环引用的对象,这可能会在某种程度上加快标记扫掠并立即获得内存。不知道我的猜测是否正确? 有什么想法吗? 非常感谢。 问题答案: Python(语言)没有说明它使用哪种形式的垃圾收集。您描述的主要实现(通常称为CPython)。其他版本,例如Jyth

  • 问题内容: 在多个开源项目中,我看到人们确实在获取当前文件的绝对路径。 但是,我发现并产生相同的结果。似乎有点多余。 人们使用它是有原因的吗? 问题答案: 在支持它们的操作系统上取消引用符号链接。 只需从路径中删除类似和的东西,即可提供从目录树的根到命名文件(或符号链接)的完整路径 例如,在Ubuntu上 符号链接可以包含相对路径,因此需要同时使用两者。内部调用可能会返回包含嵌入式部件的路径,然后

  • 问题内容: 为什么不能和这两个一起在构造函数中使用? 合并这样的东西的原因是什么? 问题答案: 将在同一类中调用另一个构造函数,而将调用超级构造函数。如果构造函数中没有,则编译器将隐式添加一个。 因此,如果两者都允许,您最终可能会两次调用构造函数。 示例(不要在参数中寻找含义): 现在,如果调用,将调用以下构造函数: 更新 : 如果您能够使用并且可能会得到如下结果: ( 注意 :这是为了说明 如果