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

时间:2016-09-27 23:23:13

标签: android robolectric android-testing okhttp3 mockwebserver

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

  1. 获取访问令牌
  2. 重新指导
  3. 获取用户信息(不同的基本网址)
  4. 获取其他一些东西(原始基本网址)
  5. 我正在尝试模拟重定向呼叫的响应。这是我的代码:

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

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

1 个答案:

答案 0 :(得分:2)

事实证明这很容易。在进行重定向的调用中,使用响应代码302创建新的模拟响应,并使用位置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);