Mock HttpResponse with Robolectric
android, mockwebserver, robolectric
Solution
It turns out that Robolectric's FakeHttpLayer only works with Apache's HttpClient, which is highly discouraged on versions greater than Froyo. Extracted from Robolectric's Google Group
That being said, the usage of HttpUrlConnection will cause you trouble. I'd try to use Android's implementation of HttpClient where possible, since Robolectric intercepts all calls to that library and lets you set up canned responses to your HTTP calls. We're looking at doing the same for HttpUrlConnection, though it's not clear when that'll happen.
Apart from that, a unit test should not need to mock the HTTP layer. My approach was wrong from the beginning.
Problem
Using Robolectric 2.3-SNAPSHOT, I want to test an object that'll execute a request in the background. In order to isolate it, I'm trying to mock the HttpResponse returned, without success after some hours invested. I've created a project that anyone can clone. Simly run ./gradlew check https://github.com/Maragues/RobolectricDummyProject (git clone https://github.com/Maragues/RobolectricDummyProject.git) I've tried Robolectric.setDefaultHttpResponse(200, "my_mocked_word"); MockWebServer (https://code.google.com/p/mockwebserver/) But the tests fail because they query the real 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); } ``` The code executing the request ``` 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; } ``` Possibly related questions - Can't capture HTTP request with robolectric (I've tried that without success. Perhaps I'm missing something) - Anyone had success mocking HttpRequests with Robolectric? (I'm not using eclipse)