Android 使用改造和MockWebServer模拟无网络

Android 使用改造和MockWebServer模拟无网络,android,retrofit,mockwebserver,Android,Retrofit,Mockwebserver,我想在使用改造和MockWebServer时模拟无网络情况 我目前正在使用Espresso进行测试,并在开始测试之前将MockWebServers url提供给RestAdapter。这对于模拟服务器响应等非常有用,但是我看不到一种简单的方法来编写java.net.ConnectException当设备没有网络时抛出的异常脚本。我可以看到MockResponse允许节流模拟等等,但没有自定义异常 我知道我可以从根本上模拟改型所使用的实际web api接口,但如果可能的话,我希望通过使用MockW

我想在使用
改造
MockWebServer
时模拟无网络情况

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

我知道我可以从根本上模拟
改型
所使用的实际web api接口,但如果可能的话,我希望通过使用
MockWebServer
使用与我的其他测试相同的方法

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


感谢

在这里明确哪些类型的异常,您可以看到不同之处:

因此,您可以得到两种类型:

未知主机异常-当您没有internet或未知主机时。。。要模拟此情况,请为适配器设置不正确的端点

ConnectException-mockwebserver可以引发超时异常。您可以在此处看到如何执行此操作:


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

改型有一个
改型模拟
模块,它提供了一个
模拟重新适应
类,其目的是模拟网络延迟和错误

这是一个与普通的
RestAdapter
结合使用的服务实例。您可以在repo的
samples/mock github client/
文件夹中看到完整示例:

MockRestAdapter
提供以下API:

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

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

我不知道它是否有用,但您可以使用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)设置为该数字端口,以便进行测试。

对我有效的方法是将改装URL(端点)指向随机不存在的主机。 我使用了“thisIsARandomHost.com”和bingo,我能够模拟未知主机异常

例如:setAPP_URL=“”

这里,setAPP_URL是一个字符串变量,它包含我的URL,我将其传递给改型,当我想在测试中模拟未知主机异常时,我会如上所述设置URL。出于所有其他目的,它会设置为我的应用程序所需的有效URL

如上所述,MockWebServer是模拟改造响应的一个很好的库,但您不需要该库来模拟此异常。为了模拟所有其他异常,我推荐MockWebServer,我在项目中经常使用它来测试响应


注意:您可以将应用程序url设置为任何url,只要该url在web上不存在

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

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

+1感谢您的回答,但它并没有真正回答问题,因为我想模拟没有网络而不是超时。调度员很有趣。我想知道我是否可以抛出上述异常,尽管…似乎我不能,因为网络异常已检查,并且调度程序仅根据其接口抛出Intrupted链接已断开:(更新链接:先生,我试图覆盖改造的baseurl到mockwebserver的baseurl,但在执行测试时,我仍然会调用webservice,有没有办法阻止它?请协助。@tony19,Jake Wharton