在Android UIAutomator中处理异步操作,可以使用UiDevice
的wait
方法配合Espresso
的IdlingResource
接口。以下是一个简单的示例:
- 首先,确保你的项目中已经添加了Espresso依赖。在app的build.gradle文件中添加以下依赖:
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将会等待,直到资源状态变为空闲。这样你就可以在测试用例中正确处理异步操作了。