Mockito mock HttpResponse [Array [Byte]] для модульного теста в Scalaj-Http - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть функция, которая делает запрос получает ответ в байтах и ​​записывает в файл. Часть функции приведена ниже.

val bytes = Http(url).timeout(connTimeout, readTimeout).method("GET").proxy(proxyUrl, proxyPort).asBytes.body
val dest = new File(filePath)
dest.createNewFile
val out = new FileOutputStream(destFile)
IOUtils.write(bytes, out)
IOUtils.closeQuitely(out)

Я пытаюсь выполнить модульное тестирование этой функции. Я использую mockito и Http это объект. Так что издеваться над ней невозможно. Но, с другой стороны, HttpRequest и HttpResponse являются case классами и могут быть подделаны. Итак, я сделал это в тесте.

//Read bytes from test resource file
val bytes = Files.readAllBytes(Paths.get(testFile))

// Mock
val mockHttpReq = mock(classOf[HttpRequest])
val mocmHttpRes = mock(classOf[HttpResponse[Array[Byte]])
when(mockHttpReq.asBytes).thenReturn(mockHttpRes)
when(mockHttpRes.body).thenReturn(bytes)

Теперь, когда я вызываю реальную функцию, т.е. когда Http(url).timeout(connTimeout, readTimeout).method("GET").proxy(proxyUrl, proxyPort).asBytes.body на самом деле называется, я не получаю Byte, то есть он пустой.

Я новичок в скале и мокито. Я думаю, что я все правильно установил. Если я что-то упустил, пожалуйста, ведите меня.

1 Ответ

0 голосов
/ 18 апреля 2019

Я думаю, что вы не используете правильный инструмент для работы, макеты в основном предназначены для насмешек над вашими собственными классами, вы должны стараться избегать, насколько это возможно, насмешек сторонних API / классов.

Для этой конкретной проблемы я бы порекомендовал провести интеграционный тест для этого компонента (назовем его MyHttpClient), используя что-то вроде wiremock в качестве фальшивого веб-сервера.

После того как вы протестировали MyHttpClient, вы можете смоделировать его в любом другом тесте, где от него зависит компонент, который вы тестируете.

...