Android Espresso: Подождите, пока активность завершится/запустится

Есть ли каноническое решение, использующее Espresso для ожидания завершения или запуска определенного действия?

У меня есть SplashActivity, который появляется в течение нескольких секунд, а затем MainActivity. Я хочу, чтобы Espresso взаимодействовал с MainActivity, а не с SplashActivity, но я не могу найти никакой информации о ожидании такого условия.

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

Ответ 1

Я предполагаю, что ваша активность всплеска выполняет некоторую инициализацию.

Если это так, мое предложение состоит в том, чтобы определить какой-то шаблон слушателя, чтобы иметь возможность получить обратный вызов, когда выполняется инициализация. Затем вы можете заставить Espresso ждать инициализации с IdlingResource.

NB: Следующий код НЕ является полным, но он предназначен для подсказки, как это сделать:

public class SplashIdlingResource implements IdlingResource, YourApplicationInitListener {

    // volatile because can be set by a different
    // thread than the test runner: the one calling back
    private volatile boolean mIsInitialized;

    private ResourceCallback mCallback;

    public SplashIdlingResource() {
        YourApplication application = // retrieve your Application object
        mIsInitialized = application.isInitialized();
        if (!mIsInitialized) {
            application.addInitListener(this);
        }
    }

    @Override
    public String getName() {
        return SplashIdlingResource.class.getName();
    }

    @Override
    public boolean isIdleNow() {
        return mIsInitialized;
    }

    @Override
    public void registerIdleTransitionCallback(ResourceCallback callback) {
        mCallback = callback;
    }

    @Override
    public void onApplicationInitCompleted() {
        m_isInitialized = true;
        if (m_callback != null) {
            m_callback.onTransitionToIdle();
        }
    }
}

Где onApplicationInitCompleted() - это обратный вызов, который вы определили и который должен вызываться, когда выполняется операция Splash, и поэтому выполняется инициализация.

Наконец, зарегистрируйте этот новый IdlingResource с помощью Espresso, вызвав Espresso.registerIdlingResource в настройке теста.