У меня такая же проблема. Я не мог понять абсолютно изящное решение, но я тоже опубликую свой подход.
Что я пытался сделать, это переопределить indeterminateDrawable
на ProgressBar. При наличии простой переносимой анимации не происходит, и тест Espresso не сталкивается с проблемой Idle.
К сожалению, main
и androidTest
обрабатываются одинаково. Я не нашел способ переопределить стили моего ProgressBar.
Теперь это привело к объединению некоторых идей от https://gist.github.com/Mauin/62c24c8a53593c0a605e#file-progressbar-java и How to detect whether android app is running UI test with Espresso.
Сначала я создал пользовательские классы ProgressBar, один для отладки и один для выпуска. Версия выпуска только вызывает суперконструкторы и ничего не делает. Отладочная версия переопределяет метод setIndeterminateDrawable
. С этим я мог бы установить простой вариант, а не анимационный. Код
выпуска:
public class ProgressBar extends android.widget.ProgressBar {
public ProgressBar(Context context) {
super(context);
}
public ProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
}
Debug код:
public class ProgressBar extends android.widget.ProgressBar {
public ProgressBar(Context context) {
super(context);
}
public ProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@SuppressWarnings("deprecation")
@Override
public void setIndeterminateDrawable(Drawable d) {
if (isRunningTest()) {
d = getResources().getDrawable(R.drawable.ic_replay);
}
super.setIndeterminateDrawable(d);
}
private boolean isRunningTest() {
try {
Class.forName("base.EspressoTestBase");
return true;
} catch (ClassNotFoundException e) {
/* no-op */
}
return false;
}
}
Как вы можете видеть, что я также добавил проверку, если мое приложение работает тест Espresso, в то время как класс я ищу это основание моих тестов эспрессо.
Плохо то, что вам нужно обновить весь свой код, чтобы использовать свой пользовательский ProgressBar. Но хорошо, что ваш код выпуска не оказывает существенного влияния на это решение.
Это работает для меня, и это кажется наиболее прямо вперед решение здесь. – MungoRae
Это решение является лучшим, поскольку позволяет избежать изменения кода производства из-за тестирования – pablisco