如何使用scalamock在Play中存根WSRequestHolder.post()

时间:2014-12-12 16:00:30

标签: scala playframework scalamock

我在使用scalamock在Play WS库中的WSRequestHolder中存根post()方法时遇到了麻烦。

以下是我正在尝试的内容:

(request.post[Results.EmptyContent](_ : Results.EmptyContent)(_ : Writeable[Results.EmptyContent], _: ContentTypeOf[Results.EmptyContent])) when(Results.EmptyContent(), *,*) returns Future.successful(response)

目标是在使用Future.successful(response)调用post()时返回Results.EmptyContent

我得到的编译器错误是:

  

当不是(play.api.mvc.Results.EmptyContent,   play.api.http.Writeable [play.api.mvc.Results.EmptyContent]   play.api.http.ContentTypeOf [play.api.mvc.Results.EmptyContent])=>   scala.concurrent.Future [play.api.libs.ws.WSResponse]        (request.post [Results.EmptyContent](_:Results.EmptyContent)(_:可写[Results.EmptyContent],_:   ContentTypeOf [Results.EmptyContent]))。当(Results.EmptyContent(),   )返回Future.successful(响应)

知道我做错了吗?


更新

这里有一些我不太懂的东西。如果我定义以下特征:

  trait TestTrait {
    def post[T](data: T)(implicit wrt: Writeable[T], ct: ContentTypeOf[T]): Future[WSResponse]
  }

post()方法与WSRequestHolder.post()具有相同的签名,我可以成功存根。因此,WSRequestHolder.post()中存在一些特定于此问题的奇怪现象。关于类型推断的一些细微差别可能吗?


更新2

所以,我找到了一个解决方法。在我的测试中,我定义了一个扩展WSRequestHolder的新特征:

trait StubbableWSRequestHolder extends WSRequestHolder {
  override def post[T](data: T)(implicit wrt: Writeable[T], ct: ContentTypeOf[T]): Future[WSResponse] =
    withMethod("POST").withBody(body).execute()
}

在我的测试中,我从这个特性创建了我的存根。如您所见,与WSRequestHolder不同,post()的覆盖签名明确指出Future[WSResponse]的返回类型。

但问题仍然存在,究竟究竟发生了什么?对于类型推断,scalamock是否存在某种限制?

1 个答案:

答案 0 :(得分:0)

此问题已在ScalaMock-3.2.1中修复