首页 > 解决方案 > 运行测试时模拟匹配器出现问题

问题描述

我是 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.

标签: scalamockitomatcher

解决方案


您在.Format[T]的假Matcher实例旁边隐式传递ESDetails. Mockito 要求所有参数都是真实实例或匹配器,并且不允许您混合它们,正如您从此错误消息中看到的那样。

最简单的解决方法是将隐式参数转换为匹配器,例如

.fetchById[JsValue](anyObject[ESDetails])(eq(implicitly[Format[T]]))

另请参阅什么是 scala 证据参数 以及如何在 Mockito 和 Scala 中使用隐式匹配器存根方法调用

正如 Mateusz 所提到的,使用 scalamock 可能比 Mockito 更好,因为它是为 Scala 设计的,因此可以更好地处理这种情况。


推荐阅读