MockWebServer не перехватывает вызовы, сделанные в методе @Before - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь написать Android Инструментальные тесты (тестирование пользовательского интерфейса) с Эспрессо . Внутренне я использую базу данных Realm для локального хранения. Теперь для сетевых вызовов я использовал MockWebServer для быстрого перехвата и возврата ответа.

Но некоторые экраны, которые я хочу протестировать, зависят от локальных данных, хранящихся в базе данных Realm, и пытаются прочитай это.

Я попытался заполнить данные, явно вызвав вызов REST в методе установки моего тестового класса, определил соответствующий ответ как Json и добавил этот путь к моему MockWebServer. Теперь я ожидал, что мои приложения logi c сохранят данные таким образом. Но MockWebServer не перехватывает какие-либо сетевые вызовы, сделанные до фактического запуска теста (то есть те, которые я сделал явно для сохранения данных в Realm).

Я думаю, что, возможно, MockWebServer начинает перехватывать только после того, как приложение запускается и не до этого. Но я не нашел никаких доказательств этого в сети до сих пор.

Вот код, устанавливающий веб-сервер Mock:

@Before
public void setUp() throws Exception {
    MockWebServer server = new MockWebServer();
    server.shutdown();
    server.setDispatcher(getDispatcher());
    server.start();
    .....
    userRepository.getAuthenticatedUser();  // Mock web server doesn't intercept the call made here.
    .....
}

А вот мой поддельный код веб-сервера:

private Dispatcher getDispatcher() {
    final Dispatcher dispatcher = new Dispatcher() {
        @Override
        public MockResponse dispatch(RecordedRequest request) {
            try {
                switch (request.getPath()) {
                    case "/channels":
                        return new MockResponse()
                                .setResponseCode(200)
                                .setBody(RestServiceTestHelper.getStringFromFile(
                                        InstrumentationRegistry.getInstrumentation().getContext(),
                                        "get_channels_200_ok_response.json"));
                    case "/users/me":
                        return new MockResponse()
                                .setResponseCode(200)
                                .setBody(RestServiceTestHelper.getStringFromFile(
                                        InstrumentationRegistry.getInstrumentation().getContext(),
                                        "get_authenticated_user_200_ok_response.json"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            throw new IllegalStateException("no mock set up for " + request.getPath());
        }
    };
    return dispatcher;
}

Действие запускается в начале каждого тестового примера следующим образом:

@Test
public void testNavigationBar_shouldSelectAgendasByDefaultAndShowAgendasView() {
    userRepository.getAuthenticatedUser();  // Mock web server doesn't intercept the call made here. 
    activityRule.launchActivity(new Intent());
    ...
}

@Test
public void testNavigationBar_shouldSelectAgendasByDefaultAndShowAgendasView() {
    activityRule.launchActivity(new Intent());
    ...
    userRepository.getAuthenticatedUser();  // Mock web server DOES intercept the same call made here.
    ...
}

Я был бы очень признателен за любые указания относительно того, почему MockWebServer не перехватывает вызовы, сделанные до того, как тесты будут фактически запустите и приложение запустится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...