【问题标题】:How to properly mock HttpGet call on Android test如何在 Android 测试中正确模拟 HttpGet 调用
【发布时间】:2012-09-12 06:47:27
【问题描述】:

我有一个使用 HttpGet 执行 HTTP GET 调用的应用程序,我想模拟响应以测试不同的场景,而无需设置任何特定的本地服务器来充当远程服务器。

目标是进行非常高级别的测试,就像真实用户 (Robotium) 一样,并伪造应用程序调用真实服务器所获得的响应。如果您需要示例,就像测试 Twitter 客户端一样。

【问题讨论】:

  • 我使用 Robolectric 的 FakeHttpLayer 模拟 http 请求和响应,请参阅我的答案 here 以获取示例用法。

标签: android unit-testing http mocking robotium


【解决方案1】:

好的,这就是我在 Robotium 测试中获取虚假 HttpResponses 的方法: - 我有一个类 HttpCallBuilder,通常只返回一个 DefaultHttpClient - 我在测试中添加了一个setHttpClient()方法来设置一个MockHttpClient(需要在HttpClient接口中实现(空)很多方法,这里我省略了):

public class MockHttpClient implements HttpClient {

private static Context context;
private final BasicHttpParams params = new BasicHttpParams();

@Override
public HttpResponse execute(HttpUriRequest request) throws IOException,
        ClientProtocolException {
    InputStream mockInputStream = context.getAssets().open(
            MockResponses.forRequest(request));
    return new MockHttpResponse(mockInputStream);
}

@Override
public HttpParams getParams() {
    return params;
}

public static void setContext(Context applicationContext) {
    MockHttpClient.context = applicationContext;
}
}

MockResponses 可让您根据情况为您的 Mock 提供正确的响应:

public class MockResponses {

private static final List<String[]> responseMapping = new ArrayList<String[]>();
private static final String BASE = "mocks/";

public static String forRequest(final HttpUriRequest request) {
    final String requestString = request.getURI().toString();
    for (final String[] mapping : responseMapping) {
        if (requestString.matches(mapping[0])) {
            return BASE + mapping[1];
        }
    }
    throw new IllegalArgumentException(
            "No mocked reply configured for request: " + requestString);
}

public static void forRequestDoAnswer(final String regex,
        final String fileToReturn) {
    responseMapping.add(new String[] { regex, fileToReturn });
}

public static void reset() {
    responseMapping.clear();
}
}

在您的测试中,您可以像这样准备测试:

HttpCallBuilder.setHttpClient(new MockHttpClient());
MockHttpClient.setContext(context);
MockResponses.reset();
MockResponses.forRequestDoAnswer(".*method=Login.*", "loginform.html");

【讨论】:

    【解决方案2】:

    Google 提供了一个名为 Mockwebserver 的库,可用于模拟 Web 服务响应。 https://code.google.com/p/mockwebserver/你可以参考这个链接

    【讨论】:

    • 为什么会遭到反对? MockWebServer(未移至 okhttp 项目)似乎是执行 OP 要求的完全有效的方法。
    • 好吧,它不是由 Google 提供的。它只是托管在 Google Code 上。
    【解决方案3】:

    使用Mockito 怎么样?

    根据this article,它的最新版本应该支持dalvik,所以你应该可以将它与robotium一起使用。

    使用 mockito,您可以模拟任何对象以返回您想要的任何内容。我发现它非常强大和简洁。

    【讨论】:

      【解决方案4】:

      试试 XML Mimic,它会解决你的问题。它易于配置和作为独立服务器运行。

      http://sourceforge.net/projects/xmlmimic/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 2013-08-21
        • 2021-11-19
        • 2019-11-30
        相关资源
        最近更新 更多