如何为 Espresso 测试切换 AndroidX 架构组件任务执行器

How to switch out AndroidX Architecture Component task executor for Espresso tests

我们 运行 遇到了一个不稳定的 Espresso 测试问题,并且非常确定原因是 LiveData#postValue 调用。似乎 Espresso 有时会在 ArchTaskExecutor 实例上执行所有任务之前做出断言。

在我看来,这个问题应该可以通过使用 IdlingResource 来解决:我们可以将 ArchTaskExecutor 换成与 CountingIdlingResource 集成的,以确保 Espresso 知道正在执行的任务。然而,似乎无法设置正在使用的执行程序,因为 ArchTaskExecutor#setDelegate 仅在 arch 库本身中可用。我们当然可以停止使用 postValue 并使用与 CountingIdlingResource 集成的处理程序(带有主循环程序)。所以我们不必这样做是否有任何其他方法可以切换或与 ArchTaskExecutor 集成,让 Espresso 知道它何时和何时不空闲?

经过一些挖掘,我发现 CountingTaskExecutorRule is available in the AndroidX Arch package。这可用于构建空闲资源,如下所示:

public class CountingTaskExecutorIdlingResource implements IdlingResource {

    private final CountingTaskExecutorRule rule;
    private ResourceCallback resourceCallback;

    public CountingTaskExecutorIdlingResource(CountingTaskExecutorRule rule) {
        this.rule = rule;
    }

    @Override
    public String getName() {
        return CountingTaskExecutorIdlingResource.class.getName();
    }

    @Override
    public boolean isIdleNow() {
        boolean idle = rule.isIdle();
        if (idle && resourceCallback != null) {
            resourceCallback.onTransitionToIdle();
        }

        return idle;
    }

    @Override
    public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
        this.resourceCallback = resourceCallback;
    }
}