Есть ли способ узнать, была ли запущена работа с Espresso?

Я делаю тестирование перехода активности с помощью Espresso, но я не знаю, подходит ли это для этого:

public void testStartLogin() {
    onView(withId(R.id.register)).perform(click());
    onView(withId(R.id.login_password)).check(matches(isDisplayed()));
    onView(withId(R.id.login_show_password)).check(matches(isDisplayed()));
}

Последние два относятся ко второму действию, но для меня это выглядит ужасно. Есть ли другой способ?

Ответ 1

Утверждение чего-либо против представления, относящегося к определенной деятельности, на мой взгляд очень элегантный способ проверить, была ли эта конкретная деятельность запущена. Из официальных документов:

В то же время структура предотвращает прямой доступ к действиям и представлениям приложения, поскольку удержание этих объектов и их работа с потоком пользовательского интерфейса является основным источником тестовой flakiness. Таким образом, вы не увидите таких методов, как getView и getCurrentActivity в API Espresso.

Однако есть способ выполнить то, что вам нужно, например, показано здесь. В моей версии я также определил метод утверждения, например:

 public void assertCurrentActivityIsInstanceOf(Class<? extends Activity> activityClass) {
    Activity currentActivity = getActivityInstance();
    checkNotNull(currentActivity);
    checkNotNull(activityClass);
    assertTrue(currentActivity.getClass().isAssignableFrom(activityClass));
}

который я использовал в методах тестирования.

Для моих собственных тестов у меня не было никаких проблем с этим (Espresso 2.0!), но это сделало его несколько лишним, так как я все равно проверю виды, принадлежащие этому действию. Так оно работает, но я бы не рекомендовал его.

Удачи!

ИЗМЕНИТЬ:

Существует также возможность проверить, было ли намерение отправлено от вашего первого действия ко второму (проверьте этот короткий учебник), но это необязательно означает, что второе действие правильно отображало все его представления. Вы все равно должны проверить их отображение, которое возвращает вас туда, где вы начали.

Ответ 2

Авторы Espresso препятствуют доступу к фактической активности для определения состояния приложения.

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

Однако эспрессо поставляется с ActivityLifecycleMonitor, который отслеживает состояния действий. Вы можете получить к нему доступ и выполнить свое утверждение так:

final Activity[] activity = new Activity[1];

InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
        @Override
        public void run() {
           activity[0] =Iterables.getOnlyElement(ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED));
}

assertTrue(activity instanceof MyActivity.class);

Что не выглядит лучше, чем ваш подход, а также может быть шелушащимся и подверженным условиям гонки, если ваша предыдущая деятельность выполняет какую-либо работу после нажатия кнопки регистрации.

Ответ 3

Этот короткий фрагмент должен работать:

intended(hasComponent(ExpectedActivity.class.getName()));

Ответ 4

Вы можете сделать:

intended(hasComponent(new ComponentName(getTargetContext(), ExpectedActivity.class)));

Loot at ответ от @riwnodennyk