如何为 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;
}
}
我们 运行 遇到了一个不稳定的 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;
}
}