2011-05-17 83 views
4

我正在编写一个Android应用程序,有时需要通过来自REST API的HTTP请求数据。我正在使用Apache DefaultHttpClient执行请求。有没有办法为这个应用程序编写测试,并在运行测试时“替换”DefaultHttpClient的响应,以便测试结果始终保持一致?在Android中伪装HTTP请求响应以进行测试

作为我想测试的一个例子,我正在访问的一个Web服务接受一个字符串并执行文本搜索,返回一个分页的对象列表。我需要测试列表为空的情况,列表适合第一页,或列表大于一个页面,并且应用程序需要发出多个请求才能获取完整列表。

我不是这个web API的开发者,也不能修改它的回应,所以我不能改变它的回报。对于上面的例子,如果我想测试返回列表为空的情况,我可以搜索一个字符串,我肯定不会返回任何结果,但另外两种情况更难,因为该服务可以回报总是在变化。

我认为理想情况下,我将有一种方法在运行测试时获取修改的DefaultHttpClient,该测试返回给定URL的请求的硬编码结果,而不是实际执行网络请求。这样,我将始终获得一致的结果,而不依赖于真实的Web服务响应。

我目前正在使用Robotium进行测试,但我也愿意使用其他工具。

+0

请参阅https://github.com/fabiolnm/FakeWeb-Android-Project,这是一个符合dmon建议的实现。 – 2012-03-05 07:50:04

回答

2

是的,当使用HttpClient框架时,您肯定可以“伪造”响应。这是相当令人费解,而且我将要离开大多数细节给你,但我会给你一个快速概述:

  1. 实施ClientHttpRequestFactory,主要是让你可以重写createRequest()方法,所以你可以.. 。

  2. 返回的ClientHttpRequest您的自定义实现,在其中您可以覆盖​​方法,以便你可以...

  3. 返回的ClientHttpResponse您的自定义实现中,你将最终能够回到你的假响应数据,例如getBody()可以返回一个文件的内容,你可以硬编码的报头getHeaders()

其余的是搞清楚如何最好地将所有这些把戏给你的服务层。

+0

谢谢,我会试试这个。 – izq 2011-05-17 02:36:50

+0

我想指出的是,我们也在使用Robotium进行测试,因此您正处于正确的轨道上。 – dmon 2011-05-17 02:39:55

2

你可能会给查尔斯尝试这样的事情。排序一个非代码解决方案。

http://www.charlesproxy.com/

我用的是查尔斯的反向代理,并为这样的事情在地图的本地工具。

你要做的是在反向代理端口上将你的请求指向你的本地盒子。 Charles可以将其配置为提供静态硬编码平面文件,但对于您的应用程序,它看起来像100%真正的Web服务响应。

您可以使用Charles做很多其他很酷的事情 - 从您的android应用程序往返您的服务器和断点(它允许您在发送和接收之前调整请求和响应)。绝对值得一试。

0

另一种选择是使用依赖注入,以便在运行测试时更改HttpClient。如果您有兴趣,请查看Guice

0

我猜你对使用标准Android Junit测试框架编写功能测试感兴趣。所以你可以在你自己的web服务器上实现你正在使用的API部分,并在运行你的测试时指向那个服务器。

如果你希望你的测试是独立的,你可以实现一个运行在设备上的Http服务器。使用Android类库中可用的Http服务器的示例是herehere