我有一个函数,使请求以字节为单位获取响应并将其写入文件。该功能的一部分在下面给出。
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
,即它为空。
我是scala和mockito的新手。我想我设置正确。如果我有任何遗漏,请指导我。
答案 0 :(得分:0)
我认为您没有使用合适的工具来完成工作,模拟主要是为了模拟自己的类,因此您应尽量避免模拟第三方API /类。
对于这个特定问题,我建议使用该组件作为伪造的Web服务器,对此组件进行集成测试(我们称之为MyHttpClient
)。
一旦测试了MyHttpClient
,就可以在要测试的组件依赖于它的任何其他测试中随意模拟它。