web-dev-qa-db-ja.com

IdleResourceでビューが表示されるまで待ちます

Espresso2.2を使用してインストルメンテーションテストを作成しています。

テストしたいフロー:

  1. テストによってクリックされたラジオボタン
  2. onClickがAPIへのリクエストを起動
  3. 毎回異なる時間の後に私は応答を受け取ります
  4. 肯定応答は、アクティビティで呼び出されるインターフェイスメソッドをトリガーします
  5. onRequestSuccessvSetupAmountという名前の画面に追加のパネルを表示しています

RadioButtonをクリックした後にIdleResourceを登録して、vSetupAmountが表示されるまで待機したいと思います。しかし、私はそれを機能させることはできません。何が悪いのか教えてください。

私はそのようなIdleResourceを書きました:

public class AmountViewIdlingResource implements IdlingResource {

    private CountriesAndRatesActivity activity;
    private ResourceCallback callback;

    private SetupAmountView amountView;

    public AmountViewIdlingResource(CountriesAndRatesActivity activity) {
        this.activity = activity;

        amountView = (SetupAmountView) this.activity.findViewById(R.id.vSetupAmount);
    }

    @Override public String getName() {
        return "Amount View idling resource";
    }

    @Override public boolean isIdleNow() {
        callback.onTransitionToIdle();
        return amountView.getVisibility() == View.VISIBLE;
    }

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

}

だから私はアクティビティをIdleResourceに渡し、ビューを変数にリンクします。 isIdleNow()が値trueを返すまで、IdleResourceがテストを通過させないことを理解しています。したがって、ビューがView.GONEの場合、それ以上進むことはありません。

テストでどのように見えるか:

    // click of radioButton picked from radioGroup
    onView(withId(rgDeliveries.getChildAt(id).getId())).perform(scrollTo(), click());

    // wait for view to become visible
    Espresso.registerIdlingResources(new AmountViewIdlingResource(getActivity()));

    // go to button on view
    onView(withId(R.id.btnGetStarted)).perform(scrollTo());

    // unregister idle resource
    for (  IdlingResource resource : getIdlingResources()) {
        Espresso.unregisterIdlingResources(resource);
    }

だから私はradioButtonをクリックします。 IdleResourceは正常に登録されましたが、何も起こりません。私のデバイスにはAPI応答があります。 vSetupAmountは表示されていますが、

amountView.getVisibility() == View.VISIBLE;

これは永久にチェックされています(ただし、画面に表示されます)は常にfalseを返します。

私は何が間違っているのですか?

9
F1sher

手遅れかもしれませんが、私の答えは誰かを助けるかもしれません。

  1. AmountViewIdlingResourceをインスタンス化して登録するときは、その参照を保持し、その参照の登録を解除するだけで、すべてのIdlingResourcesの登録を解除しないでください。
  2. isIdleNow()メソッドの実装は、アイドリングリソースが毎回アイドル状態であるとは限らない場合にのみ、コールバックのonTransitionToIdle()メソッドを呼び出す必要があります。

画面にボタンが表示されるのを待つために、同様のことを行う必要がありました。ボタンは、HTTP呼び出しが終了した後にのみ表示されるようになりました。ビューの可視性のアイドリングリソースの実装は次のとおりです。

public class ViewVisibilityIdlingResource implements IdlingResource {

    private final View mView;
    private final int mExpectedVisibility;

    private boolean mIdle;
    private ResourceCallback mResourceCallback;

    public ViewVisibilityIdlingResource(final View view, final int expectedVisibility) {
        this.mView = view;
        this.mExpectedVisibility = expectedVisibility;
        this.mIdle = false;
        this.mResourceCallback = null;
    }

    @Override
    public final String getName() {
        return ViewVisibilityIdlingResource.class.getSimpleName();
    }

    @Override
    public final boolean isIdleNow() {
        mIdle = mIdle || mView.getVisibility() == mExpectedVisibility;

        if (mIdle) {
            if (mResourceCallback != null) {
                mResourceCallback.onTransitionToIdle();
            }
        }

        return mIdle;
    }

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

}

お役に立てれば

16
Cosmin Radu