How to unit test Android for HTTP requests
I used another possible framework of robolectric library. It is suitable for Android http://loopj.com/android-async-http/ HTTP client for
static AsyncHttpClient client = new AsyncHttpClient();
public static void getData (final ServerCallback callback) {
client.get("http://httpbin.org/get", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callback.onSuccess(statusCode, new String(responseBody));
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
callback.onFailure(statusCode, new String(responseBody));
}
});
}
Test category:
@RunWith(RobolectricTestRunner.class)
public class ApiTest{
@Test
public void testgetData () {
}
}
Interface
public interface ServerCallback {
// Api detect connection
void onSuccess(int statusCode, String response);
void onFailure(int statusCode, String response);
}
resolvent:
Роман,
I will provide a general answer to make you move in the right direction. My preferred method for testing HTTP requests is to use square okhttp mockwebserver. If you have questions about their use, please check project's unit tests
There are several things to address in your particular situation:
>You need to override the basic URL used in the test > the Android async HTTP library is asynchronous, but to run a consistent unit test, you will want the request / response to be synchronous
So, following your example, let's set up the test client as follows:
public class TestHttpClient {
// package-local client that can be set in tests
static AsyncHttpClient client = new AsyncHttpClient();
// package-local baseUrl that can be set in tests
static String baseUrl = "http://pastbin.org/";
public static void getData(final ServerCallback callback) {
String url = baseUrl + "get";
client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callback.onSuccess(statusCode, new String(responseBody));
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
callback.onFailure(statusCode, new String(responseBody));
}
});
}
}
To test testhttpclient, use mockwebserver to start the test server and set the client to send a request to the server:
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, sdk = Build.VERSION_CODES.LOLLIPOP)
public class TestHttpRequestTest {
@Rule
public MockWebServer mockWebServer = new MockWebServer();
@Test
public void getData_onSuccess_doesSomething() throws InterruptedException {
// Here we are creating a mock ServerCallback. We will use
// this mock object to verify the callback is invoked
ServerCallback callback = mock(ServerCallback.class);
// To test the client, we need to send a request to the mock mockWebServer.
// The MockWebServer spins up an actual backend to handle calls. You MUST
// setup the client to use the base Url of the mockWebServer instead of
// the actual url e.g.: http://httpbin.org.
TestHttpClient.baseUrl = mockWebServer.url("/").toString();
// For testing, use a synchronous client so that we can get the response before
// the test completes.
TestHttpClient.client = new SyncHttpClient();
// Set up the mockWebServer to return a MockResponse with
// some data in the body. This data can be whatever you want... json, xml, etc.
// The default response code is 200.
mockWebServer.enqueue(new MockResponse().setBody("success"));
// To simulate an error
// mockWebServer.enqueue(new MockResponse().setResponseCode(500).setBody("error"));
TestHttpClient.getData(callback); // calling the method under test
verify(callback).onSuccess(200, "success"); // using verify of mockito
}
}
Notes:
>The asynchronous HTTP client library requires some Android system components to work properly, so you must use @ runwith (...) annotation > mockwebserver requires @ config (SDK = 21) and the SDK is set to v21 or later to work with robolectric
Invalid Sign
dependencies {
testCompile 'com.squareup.okhttp3:mockwebserver:3.2.0'
testCompile 'org.mockito:mockito-core:1.10.19'
}
Happy test!!!