Espresso2.2を使用してインストルメンテーションテストを作成しています。
テストしたいフロー:
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を返します。
私は何が間違っているのですか?
手遅れかもしれませんが、私の答えは誰かを助けるかもしれません。
AmountViewIdlingResource
をインスタンス化して登録するときは、その参照を保持し、その参照の登録を解除するだけで、すべてのIdlingResources
の登録を解除しないでください。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;
}
}
お役に立てれば