可以使用 IdlingResource
机制,使 Espresso 等待应用程序 UI 线程完成一个后台操作,这可以减少 Espresso 执行第一个检查或执行的时间。以下是一个示例:
public class CustomIdlingResource implements IdlingResource {
// 这里定义了一个用于通知 Espresso 引擎应用程序是否正在忙碌的变量。
private volatile ResourceCallback callback;
private boolean isIdle = true;
public void setIdleState(boolean isIdleNow) {
this.isIdle = isIdleNow;
if (isIdleNow && callback != null) {
callback.onTransitionToIdle();
}
}
@Override
public String getName() {
return CustomIdlingResource.class.getName();
}
@Override
public boolean isIdleNow() {
return isIdle;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
this.callback = resourceCallback;
}
}
在方法调用中,你可以在 Espresso 操作之前添加一个 IdlingResource
以等待应用程序完成。例如:
@Test
public void testLogin() {
onView(withId(R.id.username_edit_text)).perform(typeText("login"));
onView(withId(R.id.password_edit_text)).perform(typeText("password"));
onView(withId(R.id.login_button)).perform(click());
// 这是我们定义的 IdlingResource。
CustomIdlingResource customIdlingResource = new CustomIdlingResource();
// 注册我们的 IdlingResource。
Espresso.registerIdlingResources(customIdlingResource);
// 在我们定义的 IdlingResource 中设置为非空闲。
customIdlingResource.setIdleState(false);
// 模拟点击后跳转到某个 Activity 进行断言操作。
onView(withId(R.id.login_success_text_view))
.check(matches(isDisplayed()));
// 在我们定义的 IdlingResource 中设置为空闲。
customIdlingResource.setIdleState(true);
// 从 Espresso 中注销我们的 IdlingResource。
Espresso