Mock HttpResponse mit Robolectric
Mit Robolectric 2.3-SNAPSHOT, ich möchte zum testen ein Objekt, das werde ausführen einer Anfrage im hintergrund. Um es zu isolieren, ich versuche zu verspotten, die HttpResponse kehrte ohne Erfolg nach ein paar Stunden investiert.
Ich habe ein Projekt erstellt, dass jeder kann Klonen. Simly laufen ./gradlew überprüfen https://github.com/Maragues/RobolectricDummyProject (git clone https://github.com/Maragues/RobolectricDummyProject.git)
Habe ich versucht,
-
Robolectric.setDefaultHttpResponse(200, "my_mocked_word");
-
MockWebServer (https://code.google.com/p/mockwebserver/)
Aber die tests fehl, da Sie query die echte 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);
}
Den code ausführen der Anfrage
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 im Zusammenhang mit Fragen
- Nicht erfassen kann HTTP-request mit robolectric (Ich habe versucht, ohne Erfolg. Vielleicht bin ich etwas fehlt)
- Jemand hatte Erfolg Spott HttpRequests mit Robolectric? (Ich bin nicht mit eclipse)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bist du deaktivieren Roboelectric der HTTP-Ebene, Sie sind also mit dem echten HTTP-Ebene. Dies bedeutet, dass es keine gescheite Magie geschieht unter der Haube des test: wenn Sie das senden einer HTTP-Anfrage, es ist wirklich alles draußen auf dem internet (wie Sie sehen).
MockWebServer nicht zu stoppen. Es setzt lediglich ein web-server lokal, dass dein test eine Verbindung herstellen kann.
So, um dieses problem zu beheben, müssen Sie stoppen, die versuchen, eine Verbindung zu einem realen server, und stattdessen eine Verbindung zu den mock-server. Um dies zu tun, muss yo injizieren/setze die URL in der Anfrage.
Können Sie versuchen, diese(ref:https://github.com/square/okhttp/tree/master/mockwebserver).
dann können Sie vergleichen, die Reaktion 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 wurden geändert von defaultHttpClient zu Okhttp.
MockResponse
?Es stellt sich heraus, dass Robolectric ist FakeHttpLayer funktioniert nur mit Apache HttpClient, die sehr entmutigt auf Versionen größer als Froyo. Extrahiert aus Robolectric, die die Google-Gruppe
, Dass gesagt wird, die Verwendung von HttpUrlConnection wird Ursache, die Sie beunruhigen. Ich würde versuchen, die Android-Umsetzung von HttpClient, wo möglich, da Robolectric fängt alle Aufrufe der Bibliothek und legen Sie Konserven Antworten auf Ihre HTTP-Aufrufe. Wir schauen uns das gleiche tun für HttpUrlConnection, obwohl es ist nicht klar, Wann das geschehen werde.
Abgesehen davon, dass ein unit-test sollte nicht müssen simulieren der HTTP-Ebene. Mein Ansatz war falsch von Anfang an.