RetroFit
とMockWebServer
を使用するときに、ネットワークがない場合をシミュレートしたいと思います。
私は現在Espresso
を使用してテストしており、テストを開始する前にMockWebServer
sのRestAdapter
にURLを提供しています。これはサーバーの応答のモックアップなどに最適ですが、デバイスにネットワークがない場合にスローされるJava.net.ConnectException
例外をスクリプト化する簡単な方法がわかりません。 MockResponseはスロットルシミュレーションなどを許可していますが、カスタム例外は許可していないことがわかります。
retrofit
が使用する実際のWeb APIインターフェースをモックするルートをたどることができることはわかっていますが、可能であればMockWebServer
を使用して他のテストと同じアプローチを使用したいと思います。
私は単純な何かを見逃したと思います:)
ありがとう
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に設定します。
ここで例外の種類を明確にするために、違いを確認できます。
したがって、2つのタイプを取得できます。
UnknownHostException-インターネットまたは不明なホストがない場合...これをシミュレートするには、アダプターに誤ったエンドポイントを設定します。
ConnectException-mockwebserverはタイムアウト例外をスローできます。ここでそれを行う方法を見ることができます:
https://github.com/square/okhttp/tree/master/mockwebserver
本当にあなたのコードがどういうものかはわかりませんが、これが役に立つことを願っています
有用かどうかはわかりませんが、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(エンドポイント)が存在しないランダムなHostを指すようにすることです。 「thisIsARandomHost.com」を使用して、不明なホスト例外を模倣することができました。
例:setAPP_URL = " http://thisIsARandomHost.com/ ";
ここで、setAPP_URLは、retrofitに渡す私のURLを含む文字列変数です。テストで不明なホスト例外をモックしたい場合は、上記のようにURLを設定します。他のすべての目的で、URLは、アプリ。
上記の回答で述べたように、MockWebServerは改造応答をモックするための優れたライブラリですが、この例外をモックするためにそのライブラリは必要ありません。他のすべての例外をモックするために、私はMockWebServerをお勧めします。私のプロジェクトでは、それを使用して応答をテストしています。
注:アプリのURLは、そのURLがウェブ上に存在しない限り、何にでも設定できます。
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);
このようにして、応答またはタイムアウト例外の前に接続が時期尚早に閉じられるなどのネットワークエラーをシミュレートできます