scala - 运行测试时模拟匹配器出现问题
问题描述
我是 Mockito 的新手,我正在处理匹配器的一个非常奇怪的问题
def fetchById[T: Format](elasticDetails: ESDetails): F[ESResult[T]]
我的弹性搜索客户端有这个定义,问题从我必须通过的通用格式开始。
.fetchById[JsValue](anyObject[ESDetails])
.returns(IO.pure(ESResult(200, value = Some(fakeResponse)))) ```
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
-> at org.specs2.mock.mockito.MockitoMatchers.anyObject(MockitoMatchers.scala:49)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));```
//This the error for matchers that i'm getting after I run my tests.
解决方案
您在.Format[T]
的假Matcher
实例旁边隐式传递ESDetails
. Mockito 要求所有参数都是真实实例或匹配器,并且不允许您混合它们,正如您从此错误消息中看到的那样。
最简单的解决方法是将隐式参数转换为匹配器,例如
.fetchById[JsValue](anyObject[ESDetails])(eq(implicitly[Format[T]]))
另请参阅什么是 scala 证据参数 以及如何在 Mockito 和 Scala 中使用隐式匹配器存根方法调用
正如 Mateusz 所提到的,使用 scalamock 可能比 Mockito 更好,因为它是为 Scala 设计的,因此可以更好地处理这种情况。
推荐阅读
- ffmpeg - “破折号”是什么意思——作为 ffmpeg 输出文件名
- java - Jersey REST 服务在迁移到 Tomcat 9 后引发异常:严重:缺少方法 public javax.ws.rs.core.Response 的依赖项
- youtube-api - 如何在给定的特定频道/频道 ID 列表中使用关键字搜索视频 - youtube data API v3?
- php - 表单中的下拉数据未插入数据库中,仅部门值未插入
- css - 如何根据全局选择器添加范围样式
- html - 我试图将 aspx web 表单嵌入到 html 页面中
- postgresql - 将以下 SQL 转换为 PostgreSQL
- oracle - Oracle 工具的替代下载站点
- python - 为什么将函数应用于数据框时会出现错误?
- reactjs - 将 React 类组件转换为功能组件