Mockito mock HttpResponse[Array[Byte]] for unit test in Scalaj-Http
I have a function that makes a request gets the response in bytes and writes to file. A part of the function is given below.
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)
I am trying to unit test this function. Я использую mockito
а также Http
это объект. So, mocking it not possible. Но с другой стороны HttpRequest
а также HttpResponse
находятся case
classes and can be mocked. So, I did this in the test.
//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)
Now when I call the actual function ie whenHttp(url).timeout(connTimeout, readTimeout).method("GET").proxy(proxyUrl, proxyPort).asBytes.body
is actually called I dont get any Byte
ie its empty.
I am new to scala and mockito. I think I set everything correctly. If I am missing anything please guide me.
1 ответ
Я думаю, что вы не используете правильный инструмент для работы, макеты в основном предназначены для насмешек над вашими собственными классами, вы должны стараться избегать, насколько это возможно, насмешек сторонних API / классов.
Для этой конкретной проблемы я бы порекомендовал провести интеграционный тест для этого компонента (назовем его MyHttpClient
), используя что-то вроде wiremock в качестве фальшивого веб-сервера.
Когда у вас есть MyHttpClient
Если вы проверили его, то вы можете свободно смоделировать его в любом другом тесте, где от него зависит компонент, который вы тестируете.