2015-08-04 4 views
0

Я пытаюсь протестировать следующую строку кода с помощью ScalaTest и ScalaMock.Mocking Play WSRequestHolder get method using 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 или я делаю что-то неправильно?

ответ

0

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

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

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 звонит метод .json из WSResponse.