使用Retrofit和MockWebServer模拟无网络

时间:2014-07-25 09:34:03

标签: android retrofit mockwebserver

我想在使用RetroFitMockWebServer时模拟无网络案例。

我正在使用Espresso进行测试,并在开始测试之前将MockWebServer的网址提供给RestAdapter。这非常适合模拟服务器响应等等,但是我无法看到一种简单的方法来编写设备没有网络时抛出的java.net.ConnectException异常。我可以看到MockResponse允许限制模拟等,但不是自定义异常。

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

我想我只是错过了一些简单的事情:)

由于

5 个答案:

答案 0 :(得分:24)

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

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

MockRestAdapter提供以下API:

  • setDelay - 设置网络往返延迟,以毫秒为单位。
  • setVariancePercentage - 设置网络往返延迟的正或负差异百分比。
  • setErrorPercentage - 设置返回calculateIsFailure()的{​​{1}}来电的百分比。

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

答案 1 :(得分:8)

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

Internet Connection Error

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

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

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

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

我真的不知道您的代码是怎样的,但我希望这很有用

答案 2 :(得分:2)

我不知道它是否有用,但您可以使用MockWebServer模拟超时:

String contentType = "Content-type: application/json";
MockResponse response = MockResponse().setResponseCode(statusCode).setBody(responseBody).addHeader(contentType);
MockWebServer proxy = new MockWebServer();
proxy.enqueue(response);
proxy.setBodyDelayTimeMs(timeoutDelay));
proxy.play(10000); //Number port - Important!!!

注意:请将您的代码的HttpClient(例如AsyncHttpClient)设置为该数字端口以进行测试。

答案 3 :(得分:2)

使用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);

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

答案 4 :(得分:1)

对我有用的是将Retrofit URL(端点)指向一个随机不存在的主机。 我使用了“ thisIsARandomHost.com”,宾果游戏能够模拟未知的主机异常。

例如:setAPP_URL =“ http://thisIsARandomHost.com/”;

在这里,setAPP_URL是包含我传递给改造的URL的字符串变量,当我想在测试中模拟未知的主机异常时,我将URL设置为上述形式。出于所有其他目的,将其设置为有效URL我的应用要求的。

如上面的答案所述,MockWebServer是一个用于模拟改造响应的出色库,但是您无需使用该库来模拟此异常。为了模拟所有其他异常,我建议使用MockWebServer,在我的项目中经常使用它来测试响应。

注意:您可以将应用程序URL设置为任何内容,只要该URL在网络上不存在即可。