0

这个问题是https://github.com/paulbutcher/ScalaMock/issues/79中提到的已解决问题的扩展

我有以下要模拟的特征:

trait HttpClient{
   def deserialize[T](response: HttpResponse)
                    (implicit um: Unmarshaller[ResponseEntity, T],
                     executionContext: ExecutionContext): Future[T]
}

我正在尝试如下模拟 HttpClient

val client = mock[HttpClient]

case class SomeTypeT(name:String, id:Int)
implicit val someTypeTFormat = jsonFormat2(SomeTypeT)   // to be able to marshal and unmarshal from JSON

(httpClient.deserialize[SomeTypeT](_: HttpResponse))
.expects(where {
  (response: HttpResponse) => {
    response.entity == ent
  }
})
.returns(Unmarshal(response.entity).to[SomeTypeT])

当我尝试模拟反序列化函数时会出现问题。如上所述,该deserialize方法由一个 Typed ParameterT和一个 type 参数HttpResponse,以及在解组响应时使用的另外 2 个隐式参数组成。

因此,问题是如何使用 ScalaMock 来模拟deserialize函数并在模拟时指定多个隐式参数。这不起作用

// Both UnMarshaller & ExecutionContext are available here as implicits
(httpClient.deserialize[SomeTypeT](_: HttpResponse)(_: Unmarshaller[ResponseEntity, SomeTypeT](_: ExecutionContext))

问题是我不能_用来指定两个隐式参数。我不知道如何实现这一点。请帮助如何模拟给定的功能

我正在使用以下库:

  • 斯卡拉版本 2.11.8
  • 最新版本 3.0.0
  • scalamock 版本 3.5.0

虽然由于使用了多个,第二次尝试甚至无法编译_,但第一次尝试导致以下异常:

org.scalamock.function.MockFunction3 cannot be cast to org.scalamock.function.MockFunction1
java.lang.ClassCastException: org.scalamock.function.MockFunction3 cannot be cast to org.scalamock.function.MockFunction1
4

1 回答 1

1

按照您链接的 GitHub 上的答案,您的代码应该类似于

(httpClient.deserialize[SomeTypeT](_: HttpResponse)(_:  Unmarshaller[ResponseEntity, SomeTypeT], _:ExecutionContext))
.expects(where {
  (response: HttpResponse, _:  Unmarshaller[ResponseEntity, SomeTypeT], _:ExecutionContext) => {
    response.entity == ent
  }
})
.returns(Unmarshal(response.entity).to[SomeTypeT])

即,您在调用中显式地将隐式参数的占位符作为第二组参数,并在where所有非隐式之后作为附加参数。

于 2017-05-10T06:19:34.920 回答