伪造HTTP请求响应以在Android中进行测试

伪造HTTP请求响应以在Android中进行测试,android,testing,Android,Testing,我正在编写一个Android应用程序,它有时需要通过HTTP从RESTAPI请求数据。我正在使用ApacheDefaultHttpClient执行请求。运行测试时,是否有方法为此应用程序编写测试并“替换”DefaultHttpClient的响应,以便测试结果始终一致 作为我想测试的一个例子,我正在访问的一个web服务获取一个字符串并执行文本搜索,返回一个分页的对象列表。我需要测试的情况下,列表是空的,列表适合在第一页,或列表大于一页,应用程序需要提出几个请求,以获得完整的列表 我不是这个web

我正在编写一个Android应用程序,它有时需要通过HTTP从RESTAPI请求数据。我正在使用ApacheDefaultHttpClient执行请求。运行测试时,是否有方法为此应用程序编写测试并“替换”DefaultHttpClient的响应,以便测试结果始终一致

作为我想测试的一个例子,我正在访问的一个web服务获取一个字符串并执行文本搜索,返回一个分页的对象列表。我需要测试的情况下,列表是空的,列表适合在第一页,或列表大于一页,应用程序需要提出几个请求,以获得完整的列表

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

我认为理想情况下,我可以在运行测试时获得一个修改过的DefaultHttpClient,它将请求返回到给定URL的硬编码结果,而不是实际执行网络请求。这样,我将始终获得一致的结果,而不依赖于实际web服务的响应

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

是的,在使用HttpClient框架时,您肯定可以“伪造”响应。这相当复杂,我将不得不将大部分细节留给您,但我将给您一个快速概述:

  • 实现
    clienthtprequestfactory
    ,主要是为了覆盖
    createRequest()
    方法,以便

  • 返回
    ClientHttpRequest
    的自定义实现,在其中可以重写
    execute()
    方法,以便

  • 返回
    ClientHttpResponse
    的自定义实现,在该实现中,您将最终能够返回伪响应数据,例如
    getBody()
    可以返回文件内容,您可以在
    getHeaders()
    中硬编码标题,等等


  • 剩下的工作是找出如何将所有这些恶作剧最好地与您的服务层联系起来。

    您可以让Charles尝试一下类似的东西。Sorta是一个非代码解决方案

    我使用Charles的反向代理和map local工具来处理类似的事情

    您要做的是将请求指向反向代理端口上的本地框。Charles反过来也可以配置为提供静态硬编码平面文件,但对您的应用程序来说,它看起来像是100%真实的web服务响应


    你还可以用Charles做很多其他很酷的事情——观察android应用程序与服务器之间的流量和断点(这允许你在发送和接收请求和响应之前调整它们)。绝对值得一看。

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

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


    如果希望测试是自包含的,可以实现在设备上运行的Http服务器。使用Android类库中提供的Http服务器的示例有和。

    谢谢,我将尝试一下。我想指出的是,我们也在使用Robotium进行测试,所以您的思路是正确的。请参阅,这是一个符合dmon建议的实现。