Как протестировать вызовы службы с помощью mockwebserver, который содержит перенаправление?

Я использую mockwebserver для имитации запроса и ответа для моего приложения для Android. Я тестирую функцию входа в систему, которая проходит серию из 4 сервисных вызовов.

  1. Получить токен доступа
  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();
}

Мой тест не работает в коде перенаправления. Я не могу залогиниться. Я нашел несколько подсказок здесь, но я не совсем понимаю, что происходит, поэтому пока не могу заставить это работать.


person AccTest    schedule 27.09.2016    source источник


Ответы (1)


Это оказалось совсем несложно. В вызове, выполняющем перенаправление, создайте новый фиктивный ответ с кодом ответа 302 и заголовком с URL-адресом местоположения. Следующий вызов будет использовать этот 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);
person AccTest    schedule 31.01.2017