形成 Mockito“语法”

2024-04-16

Mockito 看起来像是一个非常可爱的 Java 存根/模拟框架。唯一的问题是我找不到任何关于使用他们的 API 的最佳方法的具体文档。测试中常用的方法包括:

doXXX(???) : Stubber
when(T) : OngoingStubbing
then(T) : OngoingStubbing
verify(???) : T
given(T) : BDDOngoingStubbing
willXXX(???) : BDDStubber

当您在实践中看到 Mockito 的示例时,您会看到如下代码:

when(yourMethod()).thenReturn(5);

从我读过的所有文档中,我已经确定了 Mockito“语法”的几种“模式”,这些“模式”是通过将这些方法调用以菊花链形式连接在一起而获得的,就像上面的示例一样。我发现的一些常见模式是:

当/那么:当(yourMethod()).thenReturn(5);

给予/意愿:给定(yourMethod()).willThrow(OutOfMemoryException.class);

Do/When:doReturn(7).when(yourMock.fizzBu​​zz());

意愿/给予/做:willReturn(any()).given(yourMethod()).doNothing();

验证/执行:验证(yourMethod()).doThrow(SomeException.class);

我所困惑的是如何选择正确的方法调用模式/组合来对我的测试用例进行建模。看起来你可以将它们以菊花链的方式连接在一起,形成看似无穷无尽的组合,但我不确定哪种模式适合哪个问题。

一些 Mockito Guru 能否帮助阐明 Mockito 方法的哪些模式/组合用于哪些类型的测试用例(以及为什么)?提前致谢!


该方法有几个缺点when/thenReturn, when/thenThrow and when/then语法。例如,

  • 如果是when/thenReturn,如果返回类型是带有 通配符,并且您希望返回相同类型的模拟,您将无法 以避免编译警告。
  • 你不能使用when/thenThrow and when/then对于一个 void 方法。
  • 您不能在 Mockito 间谍上使用这些语法。
  • 你只能打电话when对于模拟对象的每个组合一次, 方法和参数,除非你调用reset在模拟上。
  • Calling when多次模拟一种组合 当您使用参数匹配器时,对象和方法可能会导致问题。

我发现这些案例很难记住。因此,不要尝试跟踪何时when/thenReturn, when/thenThrow and when/then语法会起作用,也不会起作用,我宁愿完全避免它们,而倾向于doReturn/when, doThrow/when and doAnswer/when备择方案。也就是说,因为您偶尔需要doReturn/when, doThrow/when and doAnswer/when,并且您始终可以使用这些方法,学习如何使用是没有意义的when/thenReturn, when/thenThrow and when/then.

注意doReturn, doThrow and doAnswer可以以同样的方式链接在一起thenReturn, thenThrow and then。他们没有的是在一次调用中返回多个值(或抛出多个异常,或运行多个答案)的选项doReturn, doThrow and doAnswer。但我发现我很少需要这样做,所以这并不重要。

还有一个缺点doReturn,我认为微不足道。您不会像使用那样进行编译时检查其参数的类型when/thenReturn。因此,如果参数类型错误,只有运行测试后才能发现。坦白说,我不在乎。

综上所述,我使用Mockito已经两年多了,我认为一贯的使用doReturn, doThrow and doAnswer成为 Mockito 最佳实践。其他 Mockito 用户不同意。

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

形成 Mockito“语法” 的相关文章

随机推荐

  • 使用 pandas 识别最近的物体

    我有一个可以使用任何编程语言完成的作业 我选择了Python和pandas 因为我几乎没有使用它们的经验 并且认为这将是一个很好的学习经历 我能够使用我从传统计算机编程中了解到的传统循环来完成作业 并且它在数千行上运行得很好 但是一旦我让它
  • 错误消息的顺序不正确

    在我的 Spring MVC 验证中 错误消息的顺序随机变化 我希望消息的顺序与页面上显示的顺序相同 我的 AccountForm java 类如下所示 NotNull message Account name cannot be empt
  • 目前不支持公式映射 - Hibernate ORM Envers

    我使用 Hibernate Envers Entity Table name user Audited class User private String id Formula SELECT name FROM other c where
  • & 后接 * 运算符的行为

    我对地址运算符后跟解引用运算符的行为有疑问 我们看一下表达式 p where p属于类型int C11 标准 第 6 5 3 2 节 规定 一元 运算符产生其操作数的地址 如果操作数的类型为 类型 结果的类型为 指向 类型 如果操作数是一元
  • mongodb C# 驱动程序中 InsertBatch 方法的最佳批量项目计数是多少?

    我听说大批量并不能真正提供任何额外的性能 什么是最优的 如果您调用 Insert 一次插入一个文档 则每个文档都会有一次网络往返 如果您调用 InsertBatch 批量插入文档 则每个批次 而不是每个文档 都会有一个网络往返 Insert
  • 在 RTC 中交付后如何丢弃更改集

    我意外地交付了更改集 其中包括一些在 RTC 中具有本地系统特定配置的附加配置文件 有没有办法在交付后放弃这些更改 我的意思是 这些变化不应该随着其他团队成员的变化而发生 如果有的话请提供任何指示 有没有办法在交付后放弃这些更改 不完全是
  • 添加Where 子句时会出现什么问题?

    我有一个简单的查询 Select Distinct BOLTYPENAME BOLTYPE BOLTYPE From BOLTYPE Inner Join WORKORDER on WORKORDER BOLTYPE BOLTYPE BOL
  • 根据javascript中深度嵌套对象中的值过滤数组

    我有具有以下结构的数组 var topics id 1 name topic title 1 sub categories id 1 name category title 1 indicators id 1 name indicator
  • Swift 的 Decimal 精度问题

    根据文档here https developer apple com documentation foundation decimal Swift 3 4 Decimal 类型是以 10 为基数桥接到 NSDecimalNumber 的表示
  • 如何将 Get-WMIObject 查询中的数据解析为字符串?

    我有以下代码行 get wmiobject class win32 computersystem select object username 它返回 用占位符编辑 username DOMAIN jsmith 需要做什么来删除填充并给我一
  • ActiveRecord“销毁”方法在 Ruby on Rails 中返回布尔值?

    我正在使用 Ruby on Rails 3 我想知道什么类型的返回将具有以下代码 user destroy 我需要它来处理案件success and fault以这样的方式 if user destroy puts True else pu
  • 在 Azure Web 应用程序上找不到证书

    我将 Web 应用程序部署为 Azure 应用服务上的 Web 应用程序 我将一些证书上传到 Azure 门户 因为 Web 应用程序通过 SSL 运行 并且我们使用另一个证书来执行一些解密 对于后一种情况 我有一种方法 在本地工作正常 来
  • 我应该将“orderby group.key”放在这个 LINQ 语句中的什么位置?

    这段代码 string words car boy apple bill crow brown var groups from w in words group w by w 0 into g select new FirstLetter
  • 如何区分刷新触发的Unload事件还是窗口关闭触发的Unload事件?

    刷新操作和窗口关闭操作都可以触发卸载事件 有没有办法区分实际触发它的操作 在我的情况下 我想忽略刷新操作 您能给我一些解决办法吗 我注意到已经有这种question https stackoverflow com questions 568
  • 在 WinForm 上禁用最小化和最大化?

    WinForms 在右上角有三个框 分别用于最小化 最大化和关闭窗体 我想要做的是删除最小化和最大化 同时保持关闭 我还想使关闭最小化表单而不是关闭它 如何才能做到这一点 The Form有两个属性称为MinimizeBox and Max
  • 如何检查何时为特定 dag 安排了下一次 Airflow DAG 运行?

    我已设置气流并运行一些 DAG 安排每天一次 0 0 我想检查下次计划运行特定 dag 的时间 但我看不到可以在管理员中执行此操作的位置 如果你愿意 你可以使用Airflow s CLI 有next execution option htt
  • 如何在 gcc 内联汇编中声明和初始化局部变量而不使用扩展内联 asm?

    我知道这是一个非常基本的问题 但我真的很困惑 事实上我绝对是 GCC 语法的新手 我想要拥有局部变量 带有标签的堆栈地址 而不使用扩展内联汇编 类似 Intel 语法中的以下代码 DATA1 DB 100 MOV AL DATA1 我猜这是
  • MySQL / 经典 ASP - 参数化查询

    在绝对紧急的情况下 我正在尝试浏览我的网站并添加参数化查询 我是新手 刚刚了解它们 我的问题是 我对连接类型知之甚少 并且我看到的所有示例都使用另一种连接方法 这让我感到困惑 我并不是特别想改变连接到数据库的方式 因为它位于很多页面上 我只
  • 如何使用 C# 从 Excel 工作表中删除 VB 代码?

    有谁知道怎么删除all使用 C 的 VB 代码形成 Excel 工作簿 这段代码不起作用 它删除第一个 最后一个 VBComponent 但在第二个VBComponent上引发ArgumentException VBProject proj
  • 形成 Mockito“语法”

    Mockito 看起来像是一个非常可爱的 Java 存根 模拟框架 唯一的问题是我找不到任何关于使用他们的 API 的最佳方法的具体文档 测试中常用的方法包括 doXXX Stubber when T OngoingStubbing the