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