Espresso Idling Resource不起作用

use*_*388 7 android android-espresso

Android espresso对测试用例非常有用.但是当我使用时IdlingResource有一些麻烦.

我有一个标志Activity,我会true在每个初始完成时设置它.

所以我的IdlingResource是这样的:

/**
 * ???????????
 */
private class WaitPingSuccessIdlingResource implements IdlingResource {
    private ChoiceServerActivity choiceServerActivity;
    private ResourceCallback mResourceCallback;

    public WaitPingSuccessIdlingResource(ChoiceServerActivity choiceServerActivity) {
        this.choiceServerActivity = choiceServerActivity;
    }

    @Override
    public String getName() {
        return String.valueOf(hashCode());
    }

    @Override
    public boolean isIdleNow() {
        if (mResourceCallback != null && choiceServerActivity.isAllDataInited()) {
            mResourceCallback.onTransitionToIdle();
        }
        boolean rst = choiceServerActivity.isAllDataInited();
        Log.i("tonghu","WaitPingSuccessIdlingResource, isIdleNow(L94): rst " + rst);
        return rst;
    }

    @Override
    public void registerIdleTransitionCallback(ResourceCallback callback) {
        this.mResourceCallback = callback;
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样注册:

Espresso.registerIdlingResources(new WaitPingSuccessIdlingResource(activity));
Log.i("tonghu", "ChoiceServerActivityTest, testPingSuccess(L42): 2222");
Run Code Online (Sandbox Code Playgroud)

通常,第二个日志仅在isIdleNow()返回时打印true.

但现在我的日志是:

I/tonghu  (23470): WaitPingSuccessIdlingResource, isIdleNow(L94): rst false
I/tonghu  (23470): ChoiceServerActivityTest, testPingSuccess(L42): 2222
Run Code Online (Sandbox Code Playgroud)

为什么我的IdlingResource不空闲时可以打印第二个日志.

我的英文很差,有任何问题,请告诉我!谢谢!


编辑: 我已经解决了这个问题:

我看到课上有评论IdlingResource:

In such cases, test authors can register the custom resource and 
{@link    Espresso} will wait for the resource to become idle prior 
to   executing a view operation.
Run Code Online (Sandbox Code Playgroud)

因此,在注册Idling资源之后,只需提供任何视图操作:

Espresso.registerIdlingResources(new  WaitPingSuccessIdlingResource(activity));
Espresso.onView(ViewMatchers.withId(R.id.list_view)).check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
Run Code Online (Sandbox Code Playgroud)

xfd*_*dai 5

同样的问题在这里,发现注册idlingResources不会导致Espresso等待,但除此之外Espresso.onView,您仍然可以使用Espresso.onIdle()等待注册的idlingResources变为空闲。

最后找到了官方文档,引用自这里

在需要闲置资源之前注册它们。

与空闲资源相关的同步优势仅在 Espresso 首次调用该资源的 isIdleNow() 方法后才会生效。

以下列表显示了此属性的几个示例:

  1. 如果在@Before注解的方法中注册空闲资源,则该空闲资源在每次测试的第一行生效。
  2. 如果您在测试中注册空闲资源,则该空闲资源将在下一个基于 Espresso 的操作期间生效。即使下一个操作与注册空闲资源的语句处于同一测试中,此行为仍然会发生。

  • 注意:在 `com.android.support.test.espresso:espresso-core:3.0.1` 中,`Espresso.onIdle()` 不会等待刚刚注册的空闲资源(通过 `IdlingRegistry.register`),只会等待 ` onView`/`onData` 确实如此,请参阅这些方法开头的 `sync` 调用。 (2认同)