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!!!

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>