我正在尝试使用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错误还是我做错了什么?
答案 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客户端代码。