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