我有一个函数,它发出请求,以字节为单位获取响应,并将其写入文件。下面给出了函数的一部分。
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的新手。我想我把所有东西都设置好了。如果我遗漏了什么,请指点我。
发布于 2019-04-18 16:49:13
我认为你没有使用正确的工具来完成这项工作,模仿主要是为了模仿你自己的类,你应该尽量避免模仿第三方API/类。
对于这个特殊的问题,我建议对这个组件做一个集成测试(让我们称它为MyHttpClient),使用wiremock之类的东西作为您的假let服务器。
一旦你测试了MyHttpClient,你就可以自由地在你测试的组件依赖它的任何其他测试中模拟它。
https://stackoverflow.com/questions/55738490
复制相似问题