我在使用 scalamock 来存根post()
Play WS 库中 WSRequestHolder 中的方法时遇到问题。
这是我正在尝试的:
(request.post[Results.EmptyContent](_ : Results.EmptyContent)(_ : Writeable[Results.EmptyContent], _: ContentTypeOf[Results.EmptyContent])) when(Results.EmptyContent(), *,*) returns Future.successful(response)
目的是在用调用Future.successful(response)
a 时返回。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)(_ : Writeable[Results.EmptyContent], _: ContentTypeOf[Results.EmptyContent])).when(Results.EmptyContent(), , ) 返回 Future.successful(response)
知道我做错了什么吗?
更新
这里发生了一些我不太明白的事情。如果我定义以下特征:
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()
}
在我的测试中,我根据这个特征创建了我的存根。如您所见,与 in 不同WSRequestHolder
,我重写的 for 签名post()
明确地说明了Future[WSResponse]
.
但是,问题仍然存在,这里到底发生了什么?这是 scalamock 在类型推断方面的某种限制吗?