使用Retrofit和MockWebServer模拟无网络

Dor*_*ori 26 android retrofit mockwebserver

我想在使用RetroFit和时模拟无网络案例MockWebServer.

我正在测试使用Espresso和提供MockWebServers url到RestAdapter我开始测试之前.这非常适合模拟服务器响应等等,但是我无法看到一种简单的方法来编写java.net.ConnectException设备没有网络时引发的异常的脚本.我可以看到MockResponse允许限制模拟等,但不是自定义异常.

我知道我可以嘲笑使用的实际web api接口,retrofit但是如果可能的话,我想使用与其他测试相同的方法MockWebServer.

我想我只是错过了一些简单的东西:)

谢谢

Jak*_*ton 24

Retrofit有一个retrofit-mock模块,它提供了一个MockRestAdapter类,其目的是模拟网络延迟和错误.

这是与正常一起使用RestAdapter来创建服务的实例.您可以samples/mock-github-client/在repo 的文件夹中看到完整的示例:https://github.com/square/retrofit/tree/parent-1.9.0/retrofit-samples/mock-github-client

MockRestAdapter 提供这些API:

  • setDelay - 设置网络往返延迟,以毫秒为单位.
  • setVariancePercentage - 设置网络往返延迟的正或负方差百分比.
  • setErrorPercentage- 设置calculateIsFailure()返回的呼叫百分比true.

在测试中,您可以调用setErrorPercentage(100)以确保发生网络错误.默认情况下,抛出错误的时间是延迟的0到3倍.将延迟设置为0以获得即时结果.

  • 链接坏了:( (2认同)

小智 8

要明确各种类型的例外情况,您可以看到差异:

Internet连接错误

所以你可以得到两种类型:

UnknownHostException - 如果您没有互联网或未知主机...来模拟此情况,请将适配器设置为不正确的终点.

ConnectException - mockwebserver可以抛出超时异常.你可以在这里看到如何做到这一点:

https://github.com/square/okhttp/tree/master/mockwebserver

真的我不知道你的代码是怎么回事,但我希望这很有用


小智 6

使用 MockWebServer 模拟网络问题的最简单方法是将 SocketPolicy 设置为 SocketPolicy.DISCONNECT_AT_START、SocketPolicy.NO_RESPONSE 等:

MockWebServer server = new MockWebServer();

MockResponse response = new MockResponse()
  .setSocketPolicy(SocketPolicy.DISCONNECT_AT_START);

server.enqueue(response);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以模拟网络错误,例如在响应或超时异常之前过早关闭连接