在Android UIAutomator中处理异步操作,可以使用UiDevice的wait方法配合Espresso的IdlingResource接口。以下是一个简单的示例:
dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.4.0'
}
AsyncTaskIdlingResource的类,实现IdlingResource接口:import androidx.test.espresso.IdlingRegistry;
import androidx.test.espresso.IdlingResource;
public class AsyncTaskIdlingResource implements IdlingResource {
private ResourceCallback resourceCallback;
private boolean isIdleNow = true;
@Override
public String getName() {
return AsyncTaskIdlingResource.class.getName();
}
@Override
public boolean isIdleNow() {
return isIdleNow;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
public void setIdleState(boolean isIdleNow) {
this.isIdleNow = isIdleNow;
if (isIdleNow && resourceCallback != null) {
resourceCallback.onTransitionToIdle();
}
}
}
IdlingResource。在@Before注解的方法中,将其添加到IdlingRegistry中:@Before
public void registerIdlingResource() {
IdlingRegistry.getInstance().register(new AsyncTaskIdlingResource());
}
AsyncTaskIdlingResource的setIdleState方法,将资源状态设置为空闲:// 假设你有一个异步任务类AsyncTask
new AsyncTask().execute();
// 在异步任务完成后,设置资源状态为空闲
AsyncTaskIdlingResource idlingResource = new AsyncTaskIdlingResource();
idlingResource.setIdleState(true);
@After注解的方法中,取消注册IdlingResource:@After
public void unregisterIdlingResource() {
IdlingRegistry.getInstance().unregister(new AsyncTaskIdlingResource());
}
现在,当你的异步操作完成时,UIAutomator将会等待,直到资源状态变为空闲。这样你就可以在测试用例中正确处理异步操作了。