【问题标题】:Scalamock: Unable to mock function with typed parameter and multiple implicit variablesScalamock:无法模拟具有类型参数和多个隐式变量的函数
【发布时间】:2017-05-10 14:19:34
【问题描述】:

这个问题是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 方法由一个类型化参数T 和一个类型为HttpResponse 的单个参数以及在解组响应时使用的另外两个隐式参数组成。

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

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

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

我正在使用以下库:

  • scala 版本 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

【问题讨论】:

    标签: scala unit-testing mocking scalatest scalamock


    【解决方案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 中作为附加参数毕竟是非隐式的。

    【讨论】:

    • 感谢这项工作。正如您正确指出的那样,我错过了在 where 语句中添加相同的隐式参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多