31

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

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

我知道我可以retrofit通过使用MockWebServer.

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

谢谢

4

6 回答 6

27

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 以获得即时结果。

于 2014-07-25T16:23:49.570 回答
10

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

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

于 2020-04-02T08:55:42.393 回答
8

要清楚这里的异常类型,您可以看到差异:

互联网连接错误

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

UnknownHostException - 当您没有互联网或未知主机时...为了模拟这一点,为适配器设置一个不正确的端点。

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

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

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

于 2014-07-25T12:18:52.397 回答
3

我不知道它是否有用,但是您可以使用 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)以进行测试。

于 2015-02-18T13:27:37.657 回答
3

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

例如:setAPP_URL = " http://thisIsARandomHost.com/ ";

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

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

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

于 2019-05-30T08:19:40.727 回答
0

mockWebServer.shutdown()在执行单元测试之前很好。

它在内部关闭套接字连接:

serverSocket!!.close()
于 2021-09-21T16:43:04.827 回答