android - 如何使用包含重定向的 mockwebserver 测试服务调用?

标签 android robolectric android-testing okhttp mockwebserver

我正在使用 mockwebserver 模拟我的 android 应用程序的请求和响应。我正在测试通过一系列 4 次服务调用的登录功能。

  1. 获取访问 token
  2. 重定向
  3. 获取用户信息(不同的基本 url)
  4. 获取一些其他东西(原始基本 url)

我正在尝试模拟重定向调用的响应。这是我的代码:

@Test
public void testSuccessfulLogin() throws Exception {
    // Post
    server.enqueue(new MockResponse()
            .setResponseCode(HTTP_OK)
            .setBody(getStringFromFile(getInstrumentation().getContext(), "access_token.json")));

    // Redirect
    server.enqueue(new MockResponse().setResponseCode(HTTP_MOVED_TEMP));

    // GET user info
    server.enqueue(new MockResponse().setResponseCode(HTTP_OK).setBody(getStringFromFile(getInstrumentation().getContext(), "userinfo.json")));

    // GET some other stuff
    server.enqueue(new MockResponse().setResponseCode(HTTP_OK)
            .setBody(getStringFromFile(getInstrumentation().getContext(), "sts.json")));

    // Init call
    loginWithoutWaiting(Data.serviceLoginUsername, Data.serviceLoginPassword);

    // Debug (need to loop 4 times to get all 4 call paths)
    RecordedRequest request = server.takeRequest();
    request.getPath();
}

我的测试在重定向代码处失败。我不能登入。我发现了一些提示 here但我不完全了解发生了什么,因此目前无法使其正常工作。

最佳答案

事实证明这很容易。在进行重定向的调用中,使用响应代码 302 和带有位置 url 的 header 创建一个新的模拟响应。下一次调用将使用该位置 url。

case "/userinfo":
return new MockResponse().setResponseCode(HTTP_MOVED_TEMP).setHeader("Location", "/api-test.com/users");

case "/api-test.com/users":
return new MockResponse().setBody("{}")).setResponseCode(HTTP_OK);

关于android - 如何使用包含重定向的 mockwebserver 测试服务调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39735780/

相关文章:

android - 如何在android中获取两次之间的时间列表?

android - 刷新 Spinner

java - 在 Activity.onCreate() 上使用 Robolectric 的 NullPointerExcepcion

android - 使用 Robolectric 测试 DialogFragments

android-recyclerview - Espresso 滑动手势测试在 Android 模拟器上失败,但在真实设备上通过

android - 任何不需要 APK 签名的 android 自动化工具?

android - 在 Android 中效果最好的模拟库/框架?

Android:使用谷歌驱动器 View 在 webview 中打开 pdf 时出现奇怪的错误

android - Robolectric - 无法加载类 : org. robolectric.shadows.ShadowMultiDex

android - Robolectric 不绑定(bind)来自另一个线程的服务