首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对http请求进行单元测试

如何对http请求进行单元测试
EN

Stack Overflow用户
提问于 2016-12-02 12:19:10
回答 1查看 6.8K关注 0票数 5

我使用了库Robolectric,这是另一个可能的框架。用于Android http://loopj.com/android-async-http/的Http客户机

代码语言:javascript
复制
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));
        }

    });
}

试题班:

代码语言:javascript
复制
@RunWith(RobolectricTestRunner.class)
public class ApiTest{

@Test
public void testgetData () {

}

}

接口

代码语言:javascript
复制
public interface ServerCallback {
    // Api detect connection
    void onSuccess(int statusCode, String response);
    void onFailure(int statusCode, String response);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-06 01:54:45

Роман,

我会给出一个大致的答案,让你走上正确的方向。测试http请求的首选方法是使用square okhttp mockwebserver。如果您对项目单元测试的使用有疑问,请检查它们。

在您的具体案例中,有几个问题需要解决:

  • 您需要覆盖测试中使用的基url
  • 但是,为了运行一致的单元测试,android-async-http库是异步的,您希望请求/响应是同步的

因此,按照您的示例,让我们按照以下步骤设置您的测试客户机:

代码语言:javascript
复制
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));
            }
        });
    }
}

若要测试TestHttpClient,请使用MockWebServer为测试拆分服务器,并设置客户端向服务器发出请求:

代码语言:javascript
复制
@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
    }
}

备注:

  • async http client库需要一些android系统组件才能正常工作,因此必须使用@RunWith(...)注释。
  • MockWebServer需要将sdk设置为v21或更高版本的@Config(sdk = 21)来使用v21。

要在项目中包括mockwebserver & mockito,请将以下内容添加到build.gradle

代码语言:javascript
复制
dependencies {
        testCompile 'com.squareup.okhttp3:mockwebserver:3.2.0'
        testCompile 'org.mockito:mockito-core:1.10.19'
    }

考试愉快!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40932103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档