11

Robolectric 2.3-SNAPSHOT を使用して、バックグラウンドでリクエストを実行するオブジェクトをテストしたいと考えています。それを分離するために、返された HttpResponse をモックしようとしていますが、数時間投資しても成功しませんでした。

誰でも複製できるプロジェクトを作成しました。単純に./gradlew check https://github.com/Maragues/RobolectricDummyProjectを実行します(git clone https://github.com/Maragues/RobolectricDummyProject.git )

私はもう試した

ただし、実際の URL を照会するため、テストは失敗します。

  private static final String MOCKED_WORD = "MOCKED";

  @Test
  public void mockedRequestUsingMockServer() throws Exception {
    mMockWebServer.enqueue(new MockResponse().setBody(MOCKED_WORD));
    mMockWebServer.play();

    Robolectric.getFakeHttpLayer().interceptHttpRequests(false);
    Robolectric.getFakeHttpLayer().interceptResponseContent(false);

    String result = request.loadDataFromNetwork();

    assertEquals(MOCKED_WORD, result);
  }

  @Test
  public void mockedRequestUsingRobolectric() throws Exception {
    Robolectric.setDefaultHttpResponse(200, MOCKED_WORD);

    String result = request.loadDataFromNetwork();

    assertEquals(MOCKED_WORD, result);
  }

リクエストを実行するコード

public String loadDataFromNetwork() throws Exception {
    // With Uri.Builder class we can build our url is a safe manner
    Uri.Builder uriBuilder = Uri.parse("http://robospice-sample.appspot.com/reverse").buildUpon();
    uriBuilder.appendQueryParameter("word", word);

    String url = uriBuilder.build().toString();

    HttpURLConnection urlConnection = (HttpURLConnection) new URL(url)
      .openConnection();
    String result = IOUtils.toString(urlConnection.getInputStream());
    urlConnection.disconnect();

    return result;
  }

おそらく関連する質問

4

3 に答える 3

4

Roboelectric の HTTP レイヤーを無効にしているため、実際の HTTP レイヤーを使用しています。これは、テストの内部で巧妙な魔法が発生していないことを意味します。HTTP リクエストを送信すると、実際にはインターネットに送信されます (ご覧のとおり)。

MockWebServer はこれを止めません。テストが接続できる Web サーバーをローカルにセットアップするだけです。

したがって、この問題を解決するには、実サーバーへの接続を試みるのをやめ、代わりにモック サーバーに接続する必要があります。これを行うには、リクエストに URL を挿入/設定する必要があります。

@Test
  public void mockedRequestUsingMockServer() throws Exception {
    mMockWebServer = new MockWebServer();
    mMockWebServer.play();
    mMockWebServer.enqueue(new MockResponse().setResponseCode(200).setBody(MOCKED_WORD));

    request.myUrl = mMockWebServer.getUrl("/");

    String result = request.loadDataFromNetwork();

    assertEquals(MOCKED_WORD, result);
    mMockWebServer.shutdown();
  }
于 2014-02-24T00:24:42.287 に答える
1

これを試すことができます(参照: https://github.com/square/okhttp/tree/master/mockwebserver )。

  // Create a MockWebServer. These are lean enough that you can create a new
    // instance for every unit test.
    MockWebServer server = new MockWebServer();
    // Schedule some responses.
    server.enqueue(new MockResponse().setBody("it's all cool"));
    // Start the server.
    server.play();
    // Ask the server for its URL. You'll need this to make HTTP requests.
    //Http is my own http executor.
    Http.Response response = http.get(server.getUrl("/"));

次に、応答を比較できますserver.enqueue(new MockResponse().setBody("it's all cool"));

MockWebServer は、okhttp https://github.com/square/okhttp/tree/master/mockwebserverの一部です。Android 4.4 の URLConnectionImpl は、defaultHttpClient から Okhttp に変更されました

于 2014-05-27T17:44:48.893 に答える