【发布时间】:2012-03-17 13:46:38
【问题描述】:
我对 robolectric 的问题是它不能发出真正的 HttpRequest。
我可以使用真正调用本地测试服务器的真实的 HttpClient 实现来替换 robolectric 的实现吗?
【问题讨论】:
标签: android testing robolectric
我对 robolectric 的问题是它不能发出真正的 HttpRequest。
我可以使用真正调用本地测试服务器的真实的 HttpClient 实现来替换 robolectric 的实现吗?
【问题讨论】:
标签: android testing robolectric
基本上你不会。 Robolectric 是一个测试框架,它是这样设计的,你问的不是我们对 Robolectric 所做的。
我相信您已经遇到过 this blog 使用 Robolectric 测试 HTTP 请求的问题。实际上,标题“如何测试 HTTP 请求” 并不是很准确的 IMO。我宁愿称它为“如何模拟 HTTP 请求”,如本博客所述,使用 Robolectric 模拟 HTTP 请求的最佳位置是您不想打扰对远程的真实网络调用服务器可能在项目开发/测试阶段。
假设我有一个主要活动连接到我的银行帐户进行一些操作,提交按钮应该将我的输入信息发布到远程服务器更新我的帐户信息,然后根据不同的响应将我带到几个不同的活动。我已经顺利地编写了所有代码,HttpClient,带有提交按钮的表单,下一个活动的新意图等等。一切都很好而且干净。对了,我如何测试点击提交按钮,根据不同的响应打开正确的活动,而不需要更改我的活动源代码或使用真实的网络调用来拧我的真实银行账户。答案是 Robolectric 模拟 http 请求。在这种情况下使用 Robolectric 的关键不是测试真正的 http 请求,而是用于欺骗我的 httpClient 代码并测试我的应用程序代码的其他部分,如 UI 内容。最终,当您的部署达到最终稳定状态时,应该在模拟器或真实设备上执行真实网络测试。
Robolectirc 团队声称的另一个优势是您不需要在模拟器或设备上启动仪器测试,这会降低效率并减慢应用程序开发/测试生命周期。
【讨论】:
Jan Berkel 向 Robolectric 提交了a pull request,该公司于 3 月 8 日合并到 master。您现在可以在测试开始时调用 Robolectric.getFakeHttpLayer().interceptHttpRequests(false); 以绕过 Robolectric 中的模拟 http 层。
您可以直接从Sonatype 下载该jar 以包含在您的Eclipse Android 项目中。如果您使用的是 Maven 并且 1.1 尚未发布(请查看上面的 Sonatype 网址),那么您将需要添加 sonatype 快照存储库并使用 robolectric 1.1-SNAPSHOT。您可以通过将以下内容添加到您的 pom.xml 来做到这一点
<repositories>
<repository>
<id>sonatype-snapshots</id>
<name>Sonatype Snapshots</name>
<layout>default</layout>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
...
<dependencies>
<dependency>
<groupId>com.pivotallabs</groupId>
<artifactId>robolectric</artifactId>
<version>1.1-SNAPSHOT</version>
<scope>test</scope>
</dependency>
...
</dependencies>
我将它用于在真实服务器上运行的集成测试,它运行良好。
【讨论】: