Mam ten sam problem. Nie mogłem wymyślić całkowicie eleganckiego rozwiązania, ale podam też moje podejście.
Co starałem się zastąpić indeterminateDrawable
na ProgressBar. W przypadku prostego losowania animacja nie jest przeprowadzana, a test Espresso nie pojawia się w stanie Bezczynności.
Niestety main
i androidTest
są traktowane tak samo. Nie znalazłem sposobu na zastąpienie stylów mojego ProgressBar.
Teraz zakończyło się łączeniem niektórych pomysłów z https://gist.github.com/Mauin/62c24c8a53593c0a605e#file-progressbar-java i How to detect whether android app is running UI test with Espresso.
Najpierw stworzyłem niestandardowe klasy ProgressBar, jeden do debugowania i jeden do wydania. Wersja Release tylko wywołuje super konstruktorów i nie robi nic więcej. Wersja debugowania zastępuje metodę setIndeterminateDrawable
. Dzięki temu mógłbym ustawić proste ciągnięcie zamiast animowanego. Kod
Release: Kod
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;
}
}
Jak widać Dodałem też sprawdzić, czy moja aplikacja jest uruchomiona test espresso, podczas gdy klasa szukam jest podstawa moich testów Espresso.
To, że musisz zaktualizować cały kod, aby użyć niestandardowego paska postępu. Ale dobrą rzeczą jest to, że twój kod zwolnienia nie ma większego wpływu na to rozwiązanie.
ten pracował dla mnie i wydaje się, że najbardziej prostego rozwiązania do przodu tutaj. – MungoRae
To rozwiązanie jest najlepsze, ponieważ unika konieczności modyfikacji kodu produkcyjnego z powodu testowania. – pablisco