如何对HTTP请求Android进行单元测试

罗马·达维什

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

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));
        }

    });
}

测试类别:

@RunWith(RobolectricTestRunner.class)
public class ApiTest{

@Test
public void testgetData () {

}

}

接口

public interface ServerCallback {
    // Api detect connection
    void onSuccess(int statusCode, String response);
    void onFailure(int statusCode, String response);
}
失踪

小说,

我将提供一个一般性的答案,以使您朝正确的方向前进。我测试HTTP请求的首选方法是使用方形okhttp mockwebserver如果您项目的单元测试有疑问,请复习一下

在您的特定情况下,有几件事要解决:

  • 您需要覆盖测试中使用基本网址
  • Android的异步HTTP库是异步的,但是,要运行一个一致的单元测试,你会想请求/响应是同步的

因此,按照您的示例,让我们如下设置测试客户端:

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来启动服务器进行测试,并设置客户端向服务器发出请求:

@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需要将@Config(sdk = 21)sdk设置为v21或更高版本才能与Robolectric一起使用。

在您的项目中包含模拟网络服务器和模拟人,请将以下内容添加到build.gradle

dependencies {
        testCompile 'com.squareup.okhttp3:mockwebserver:3.2.0'
        testCompile 'org.mockito:mockito-core:1.10.19'
    }

测试愉快!!!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何对需要HTTP请求的功能进行单元测试?

对使用HttpClient发出Http请求的Controller进行单元测试

如何在iOS 7.1中使用NSURLSession对HTTP请求和响应进行单元测试?

Python:如何对自定义HTTP请求处理程序进行单元测试?

如何在带有 http 请求的 lambda 上对 whenCompleteAsync 进行单元测试?

如何对Django rest框架请求进行单元测试?

如何为http请求编写单元测试?

如何对嵌套的HTTP调用进行单元测试

如何使用http作为依赖项进行单元测试

角度单元测试:如何对.map()进行单元测试?

如何对与System(或Android)类交互的方法进行单元测试

如何模拟Android NFC Tag对象以进行单元测试

如何使用 Spring MVC 测试对多部分 POST 请求进行单元测试?

对具有多个HTTP请求的功能进行单元测试

由于键入而模拟的Http获取服务请求进行角度单元测试失败

模拟WifiManager进行Android单元测试

使用rxjava进行Android单元测试

在Android NDK上进行单元测试

如何对BSD插槽进行单元测试

如何对PHP特性进行单元测试

如何对异常进行单元测试?

如何对Reduxsauce进行单元测试?

如何对JSON解析进行单元测试

如何对GC进行单元测试?

如何对canActivate of Angular进行单元测试?

如何对OData Client进行单元测试?

如何对Facebook用户进行单元测试?

如何对UITableView进行单元测试?

如何对Eclipse插件进行单元测试?