web-dev-qa-db-ja.com

RetrofitとMockWebServerを使用してネットワークをシミュレートしない

RetroFitMockWebServerを使用するときに、ネットワークがない場合をシミュレートしたいと思います。

私は現在Espressoを使用してテストしており、テストを開始する前にMockWebServersのRestAdapterにURLを提供しています。これはサーバーの応答のモックアップなどに最適ですが、デバイスにネットワークがない場合にスローされるJava.net.ConnectException例外をスクリプト化する簡単な方法がわかりません。 MockResponseはスロットルシミュレーションなどを許可していますが、カスタム例外は許可していないことがわかります。

retrofitが使用する実際のWeb APIインターフェースをモックするルートをたどることができることはわかっていますが、可能であればMockWebServerを使用して他のテストと同じアプローチを使用したいと思います。

私は単純な何かを見逃したと思います:)

ありがとう

26
Dori

Retrofitには、ネットワークの遅延とエラーをシミュレートすることを目的としたMockRestAdapterクラスを提供する_retrofit-mock_モジュールがあります。

これは、サービスのインスタンスを作成するために、通常のRestAdapterと組み合わせて使用​​されます。完全な例は、リポジトリの_samples/mock-github-client/_フォルダーにあります。 https://github.com/square/retrofit/tree/parent-1.9.0/retrofit-samples/mock-github-クライアント

MockRestAdapterが提供するAPI:

  • setDelay-ネットワークの往復遅延をミリ秒単位で設定します。
  • setVariancePercentage-ネットワークの往復遅延のプラスまたはマイナスの変動率を設定します。
  • setErrorPercentage-trueを返すcalculateIsFailure()の呼び出しの割合を設定します。

テストでは、setErrorPercentage(100)を呼び出して、ネットワークエラーが発生することを保証できます。デフォルトでは、エラーがスローされる時間は、遅延の0〜3倍です。即時の結果を得るには、遅延を0に設定します。

24
Jake Wharton

ここで例外の種類を明確にするために、違いを確認できます。

インターネット接続エラー

したがって、2つのタイプを取得できます。

UnknownHostException-インターネットまたは不明なホストがない場合...これをシミュレートするには、アダプターに誤ったエンドポイントを設定します。

ConnectException-mockwebserverはタイムアウト例外をスローできます。ここでそれを行う方法を見ることができます:

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

本当にあなたのコードがどういうものかはわかりませんが、これが役に立つことを願っています

8
mromer

有用かどうかはわかりませんが、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など)をその番号ポートに設定してください。

2
Jesús Castro

私にとってうまくいったのは、レトロフィットURL(エンドポイント)が存在しないランダムなHostを指すようにすることです。 「thisIsARandomHost.com」を使用して、不明なホスト例外を模倣することができました。

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

ここで、setAPP_URLは、retrofitに渡す私のURLを含む文字列変数です。テストで不明なホスト例外をモックしたい場合は、上記のようにURLを設定します。他のすべての目的で、URLは、アプリ。

上記の回答で述べたように、MockWebServerは改造応答をモックするための優れたライブラリですが、この例外をモックするためにそのライブラリは必要ありません。他のすべての例外をモックするために、私はMockWebServerをお勧めします。私のプロジェクトでは、それを使用して応答をテストしています。

注:アプリのURLは、そのURLがウェブ上に存在しない限り、何にでも設定できます。

1
Pawan Chauhan

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

このようにして、応答またはタイムアウト例外の前に接続が時期尚早に閉じられるなどのネットワークエラーをシミュレートできます

0