Я пытаюсь написать 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 не перехватывает вызовы, сделанные до того, как тесты будут фактически запустите и приложение запустится.