Mockito模拟HttpResponse [Array [Byte]]用于Scalaj-Http中的单元测试

时间:2019-04-18 02:54:46

标签: scala unit-testing mockito scalaj-http

我有一个函数,使请求以字节为单位获取响应并将其写入文件。该功能的一部分在下面给出。

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是一个对象。因此,嘲笑是不可能的。但是另一方面,HttpRequestHttpResponsecase类,可以被模拟。所以,我在测试中做到了。

//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,即它为空。

我是scala和mockito的新手。我想我设置正确。如果我有任何遗漏,请指导我。

1 个答案:

答案 0 :(得分:0)

我认为您没有使用合适的工具来完成工作,模拟主要是为了模拟自己的类,因此您应尽量避免模拟第三方API /类。

对于这个特定问题,我建议使用该组件作为伪造的Web服务器,对此组件进行集成测试(我们称之为MyHttpClient)。

一旦测试了MyHttpClient,就可以在要测试的组件依赖于它的任何其他测试中随意模拟它。