Можно ли отключить тосты или подождать, пока тост не исчезнет во время тестирования

Я тестирую приложение с Espresso. У меня есть один вопрос: Можно ли подождать, пока в настоящее время не будут показаны тосты. У меня много разных тостов в моем приложении, но во время тестирования у меня есть проблемы с ними, потому что, насколько я могу догадаться, фокус ушел на тост, и я получаю совсем другую иерархию представлений, как я вижу в журналах ошибок.
Поэтому мой вопрос: Можно ли скрыть все (общесистемный с корневым доступом) или просто подождать, пока на экране не появятся тосты или возможно, если можно вручную установить фокус на иерархию представления активности.
Я был бы признателен за любую помощь в решении этой проблемы.
Спасибо.

P. S. Как отключить тост прямо где-то в мое приложение-это не вариант, потому что он приносит некоторую дополнительную логику в приложение, которое необходимо только во время тестирования.

2 ответов


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

здесь я использую CountingIdlingResource который является холостым ресурсом, управляющим счетчиком: когда счетчик изменяется от ненулевого до нуля, он уведомляет обратный вызов перехода.

здесь является полным примером; ключевые моменты следуют:

public final class ToastManager {
    private static final CountingIdlingResource idlingResource = new CountingIdlingResource("toast");
    private static final View.OnAttachStateChangeListener listener = new View.OnAttachStateChangeListener() {
        @Override
        public void onViewAttachedToWindow(final View v) {
            idlingResource.increment();
        }

        @Override
        public void onViewDetachedFromWindow(final View v) {
            idlingResource.decrement();
        }
    };

    private ToastManager() { }

    public static Toast makeText(final Context context, final CharSequence text, final int duration) {
        Toast t = Toast.makeText(context, text, duration);
        t.getView().addOnAttachStateChangeListener(listener);
        return t;
    }

    // For testing
    public static IdlingResource getIdlingResource() {
        return idlingResource;
    }
}

как показать тост:

ToastManager.makeText(this, "Third", Toast.LENGTH_SHORT).show();

как настроить / сорвать тест:

@Before
public void setUp() throws Exception {
    super.setUp();
    injectInstrumentation(InstrumentationRegistry.getInstrumentation());
    Espresso.registerIdlingResources(ToastManager.getIdlingResource());
    getActivity();
}

@After
public void tearDown() throws Exception {
    super.tearDown();
    Espresso.unregisterIdlingResources(ToastManager.getIdlingResource());
}

Я не нашел идеального решения для этого, но лучше всего сделать mToast переменная-член видна для тестирования, и используйте это, чтобы отменить любой активный тост в @After, например:

при показе тостов (производственный код для тестируемой деятельности):

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
Toast mToast;

private void showToast(final String text) {
    mToast = Toast.makeText(this, text, Toast.LENGTH_LONG);
    mToast.show();
}

тестовый код (в том же пакете, что и тестируемый код):

    @After
    public void tearDown() {
        // Remove any toast message that is still shown:
        Toast toast = mActivityRule.getActivity().mToast;
        if (toast != null) {
            toast.cancel();
        }
    }

этой будет требуется изменить производственный код немного, но с помощью @VisibleForTesting in последняя версия Android Studio выдаст ошибку, если вы используете переменную-член в другом месте.