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 Если вы проверили его, то вы можете свободно смоделировать его в любом другом тесте, где от него зависит компонент, который вы тестируете.

Другие вопросы по тегам