Mock HttpResponse mit Robolectric

Mit Robolectric 2.3-SNAPSHOT möchte ich ein Objekt testen, das eine Anfrage im Hintergrund ausführt. Um es zu isolieren, versuche ich, die HttpResponse zurückzukehren, ohne Erfolg nach einigen Stunden investiert.

Ich habe ein Projekt erstellt, das jeder klonen kann. Einfach laufen ./gradlew check https://github.com/Maragues/RobolectricDummyProject (git clone https://github.com/Maragues/RobolectricDummyProject.git )

ich habe es versucht

  • Robolectric.setDefaultHttpResponse (200, "my_mocked_word");

  • MockWebServer ( https://code.google.com/p/mockwebserver/ )

Aber die Tests scheitern, weil sie die reale URL abfragen

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

Der Code, der die Anforderung ausführt

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

Möglicherweise verwandte Fragen

  • Kann keine HTTP-Anforderung mit robolectric erfassen (ich habe das ohne Erfolg ausprobiert, vielleicht vermisse ich etwas)
  • Jemand hatte Erfolg geplagt HttpRequests mit Robolectric? (Ich verwende keine Eklipse)

  • Kann jmockit und robolectric koexistieren?
  • Wie zu testen, dass eine Absicht ausgestrahlt wurde
  • Unit Test Cases mit JUnit + (Robolectric oder Mockito oder beide in Android)
  • Android-Build-Tools 1.1.0, Unit-Test-Ordner?
  • Robolectric cant gefunden Ressource und AndroidManifest.xml
  • Kotlin und ArgumentCaptor - IllegalStateException
  • Roboelektrisches und Android Studio
  • Robolectric: Loop Handler in meinem Fall
  • 3 Solutions collect form web for “Mock HttpResponse mit Robolectric”

    Sie deaktivieren die HTTP-Ebene von Roboelectric, also verwenden Sie die echte HTTP-Ebene. Dies bedeutet, dass es keine kluge Magie unter der Kapuze Ihres Tests gibt: Wenn Sie eine HTTP-Anfrage senden, geht es wirklich auf das Internet (wie Sie sehen).

    MockWebServer hört das nicht auf. Es richtet einfach einen Webserver vor Ort ein, mit dem sich dein Test verbinden kann.

    Um dieses Problem zu beheben, müssen Sie aufhören, eine Verbindung zu einem echten Server herzustellen und stattdessen eine Verbindung zum Mock-Server herzustellen. Um dies zu tun, müssen Sie die URL in die Anfrage einspritzen / setzen.

     @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(); } 

    Sie können das versuchen (ref: 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("/")); 

    Dann kannst du die Antwort auf server.enqueue(new MockResponse().setBody("it's all cool"));

    MockWebServer ist ein Teil von okhttp https://github.com/square/okhttp/tree/master/mockwebserver . Die URLConnectionImpl in Android 4.4 wurde von defaultHttpClient auf Okhttp geändert .

    Es stellt sich heraus, dass Robolectric's FakeHttpLayer nur mit Apache's HttpClient arbeitet, was bei Versionen größer als Froyo sehr entmutigt ist. Aus der Google-Gruppe von Robolectric extrahiert

    Das heißt, die Verwendung von HttpUrlConnection wird Ihnen Ärger machen. Ich würde versuchen, Android-Implementierung von HttpClient wo möglich zu verwenden, da Robolectric alle Anrufe zu dieser Bibliothek abfängt und Ihnen erlaubt, konservierte Antworten auf Ihre HTTP-Anrufe einzurichten. Wir suchen das gleiche für HttpUrlConnection, obwohl es nicht klar ist, wann das passieren wird.

    Abgesehen davon sollte ein Unit-Test nicht die HTTP-Schicht verspotten müssen. Mein Ansatz war von Anfang an falsch.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.