Издевательство над методом Play WSRequestHolder с использованием 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 как сообщение об ошибке: не удается разрешить получение символа. Тем не менее, я могу запустить тест, но макет явно не работает, и я получаю: java.util.NoSuchElementException: JsError.get.

Макет работает, когда я пытаюсь издеваться над любым другим методом WSRequestHolder, но не с методом get.

Это ошибка ScalaMock или я что-то не так делаю?


person user2664655    schedule 04.08.2015    source источник


Ответы (2)


Я не знаю, решили ли вы уже эту проблему, но недавно я пытался сделать что-то подобное, и у меня вроде получилось работать со следующим кодом:

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, вызывает метод .json WSResponse.

person Markon    schedule 15.12.2015

Извините, я не знаю Scala Mock, но я предлагаю вам взглянуть на MockWS, библиотеку, которая поставляется с фиктивным клиентом WS: play-mockws

С MockWS вы определяете частичную функцию, которая возвращает действие для маршрута. Это позволяет вам точно настроить фиктивные ответы и протестировать код http-клиента.

person Matthias    schedule 21.08.2015