我正在编写一个Android应用程序,有时需要通过HTTP从REST API请求数据。我正在使用Apache DefaultHttpClient来执行请求。有没有办法为这个应用程序编写测试并在运行测试时“替换”DefaultHttpClient的响应,以便测试结果始终保持一致?
作为我想测试的一个例子,我正在访问的一个Web服务接受一个字符串并执行文本搜索,返回一个分页的对象列表。我需要测试列表为空,列表适合第一页,或列表大于页面的情况,应用程序需要多次请求才能获得完整列表。
我不是此Web API的开发人员,也不能修改其响应,因此我无法更改它返回的内容。对于上面的例子,如果我想测试返回的列表是空的情况,我可以只搜索一个我肯定不会返回任何结果的字符串,但是其他两个案例更难,因为服务可以回归总是在变化。
我认为理想情况下,我可以在运行测试时获得修改后的DefaultHttpClient,它会返回给定URL的请求的硬编码结果,而不是实际执行网络请求。这样,我总能获得与真实Web服务响应无关的一致结果。
我目前正在使用Robotium进行测试,但我也愿意使用其他工具。
答案 0 :(得分:2)
是的,在使用HttpClient框架时,您绝对可以“伪造”响应。这很复杂,我将不得不将大部分细节留给您,但我会给您一个快速概述:
实施ClientHttpRequestFactory
,主要是为了覆盖createRequest()
方法,以便您可以...
返回ClientHttpRequest
的自定义实现,您可以在其中覆盖execute()
方法以便...
返回ClientHttpResponse
的自定义实施,您最终可以在其中返回虚假的回复数据,例如getBody()
可以返回文件内容,您可以在getHeaders()
等中对标题进行硬编码。
其他人正在弄清楚如何最好地将所有这些恶作剧绑定到您的服务层。
答案 1 :(得分:2)
你可以试试Charles这样的事情。排序非代码解决方案。
我使用Charles的反向代理和地图本地工具来做这样的事情。
您所做的是将您的请求指向反向代理端口上的本地方框。反过来,Charles可以配置为提供静态硬编码的平面文件,但对于您的应用程序,它看起来像100%真正的Web服务响应。
您可以使用Charles做很多其他很酷的事情 - 观察Android应用程序与服务器和断点之间的流量(允许您在发送和接收之前调整请求和响应)。绝对值得一试。
答案 2 :(得分:0)
另一种选择是使用依赖注入,以便在运行测试时更改HttpClient。如果您有兴趣,请查看Guice。
答案 3 :(得分:0)