我有同样的问题。我无法找到完全优雅的解决方案,但我将发布我的方法。
我尝试的是在进度条的indeterminateDrawable
上进行覆盖。当使用简单的drawable时,不会发生任何动画,并且Espresso测试不会遇到闲置问题。
不幸的是,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
。通过这种方式,我可以设置简单的drawable代替动画的drawable。
发布代码:
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);
}
}
调试代码:
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) {
}
return false;
}
}
正如您所看到的,我还添加了一个检查,以确保我的应用正在运行Espresso测试,而我要搜索的类是我的Espresso测试的基础。
不好的一点是您必须更新所有代码以使用自定义的ProgressBar。但好的一点是,这种解决方案对您的发布代码没有重大影响。