mockito - 我可以操纵模拟匹配器的顺序吗?
问题描述
一些背景
在设置模拟(when
)或验证模拟调用(verify
)时,Mockito 要求您提供模拟方法所需的所有具体值,或者为所有这些提供匹配器。无法混合使用这些样式。
when(mock.method(1, 2, 3));
when(mock.method(eq(1), eq(2), eq(3)));
我说的是第二种风格。
由于 Mockito 的工作方式,调用匹配器的顺序很重要。在内部,Mockito 将在堆栈上注册匹配器,并在必要时按顺序执行它们。
我试图达到的目标
我想编写一些与 mockito 一起使用的测试实用程序。我希望这些实用方法将调用委托给模拟,插入一些默认匹配器,否则这些匹配器将是样板测试代码。
例如:
public String callOnMock(int argument2) {
return mock.call(eq(1), argument2, argThat(i -> i >= 3));
}
这将像这样使用:
when(callOnMock(eq(2)).thenReturn("result");
问题
这不起作用,因为 Mockito 以错误的顺序注册了这些匹配器:
eq(2)
eq(1)
argThat(i -> i >= 3)
虽然它应该是
eq(1)
eq(2)
argThat(i -> i >= 3)
有没有办法让我操纵这些匹配器的注册顺序?
我现在org.mockito.AdditionalMatchers
拥有操纵内部堆栈以允许组合匹配器的方法(and
, or
, not
),因此至少在 Mockito 核心内部是可能的。
是否也可以显式地弹出和推送匹配器?
解决方案
使用Supplier
:
public String callOnMock(Supplier<Integer> argument2) {
return mock.call(eq(1), argument2.get(), argThat(i -> i >= 3));
}
when(callOnMock(() -> eq(2)).thenReturn("result");
推荐阅读
- c# - 使用空间感知网格观察器 MHL2 从对象创建网格
- typo3 - 如何在 databaseQueryProcessor 中使用选定的类别?
- android - 通过 intune 将 APK 上传到 Play 商店时出错?
- javascript - 如何设置 chrome selenium 窗口大小以匹配不同机器的尺寸?
- python - 在 Tensorflow 中计算均方对数误差返回 nan
- algorithm - 集群重编程和云重编程有什么区别?
- node.js - Heroku - 无法从 github 安装包
- aws-api-gateway - 与 AWS API 网关和 express stepfunctions 同步 RestAPI
- javascript - 如何使用 Nginx 提供文件文件夹?
- apache-nifi - 寻找 GenerateTableFetch 的等价物