Mocking Play使用Scalamock获取WSRequestHolder方法

时间:2015-08-04 10:40:21

标签: scala testing playframework scalatest scalamock

我正在尝试使用ScalaTest和ScalaMock测试以下代码行。

val responseFuture = wsClient.url(url).withQueryString(params: _*).get()

wsClient类型为THttpClient,它是play.api.libs.ws.WS的包装。

鉴于:

val mockHttpClient = mock[THttpClient]

正确地注入我正在测试的类中,测试代码是这样的:

val expectedUrl = "some url"
val mockRequestHolder = mock[WSRequestHolder]
inSequence {
  (mockHttpClient.url _).expects(expectedUrl).returns(mockRequestHolder)
  (mockRequestHolder.withQueryString _).expects(where {
    (parameters: Seq[(String, String)]) => {
      // assertions on parameters
      // ...
      true
    }
  }).returns(mockRequestHolder)

  val stubResponse = stub[WSResponse]
  val jsonBody = "{}"
  (stubResponse.json _).when().returns(Json.parse(jsonBody))
  (mockRequestHolder.get _).expects().returns(Future(stubResponse))
}

IntelliJ突出显示mockRequestHolder.get错误说:无法解析符号get。不过我能够运行测试,但模拟显然不起作用,我得到:java.util.NoSuchElementException:JsError.get。

当我尝试模仿WSRequestHolder的任何其他方法时,模拟工作正在工作,而不是使用方法get

这是一个ScalaMock错误还是我做错了什么?

2 个答案:

答案 0 :(得分:1)

我不知道你是否已经解决了这个问题,但我最近尝试过做类似的事情,并且我使用了以下代码:

val wsClientMock = mock[WSClient]
val wsRequestMock = mock[WSRequest]
val wsResponseMock = mock[WSResponse]
(wsRequestMock.withAuth _).expects(username, password, WSAuthScheme.BASIC).returning(wsRequestMock)
(wsRequestMock.get _).expects().returning(Future[WSResponse](wsResponseMock))
(wsClientMock.url _).expects(bootstrapUrl).returning(wsRequestMock)
(wsResponseMock.status _).expects().returning(200)

“有点”因为我还需要模拟响应,否则我会得到像

这样的结果
ERROR[default-akka.actor.default-dispatcher-4] OneForOneStrategy - Unexpected call: json()

由于调用WSClient的代码正在调用WSResponse的.json方法。

答案 1 :(得分:0)

抱歉,我不了解Scala Mock,但我建议你看看MockWS是一个带有模拟WS客户端的库:play-mockws

使用MockWS,您可以定义一个部分函数,​​该函数返回Route的Action。这使您可以精确配置模拟的答案并测试您的http客户端代码。