web-dev-qa-db-ja.com

Espresso内からIdlingResourceに渡すビューを取得するにはどうすればよいですか?

私は基本的に、IdlingResourceコンストラクタ引数を取るカスタムViewを持っています。それを実装する方法について本当に話しているところはどこにも見つかりません。

私はこの答えを使用しようとしています: https://stackoverflow.com/a/32763454/1193321

ご覧のとおり、ViewPagerが必要ですが、テストクラスにIdlingResourceを登録しているときに、ビューを取得する方法がわかりません。

私はfindViewById()を試しましたが、現在実行中のアクティビティを取得してから、その上でfindViewById()を呼び出しましたが、運がありませんでした。

誰もがこのシナリオで何をすべきか知っていますか?

21
EGHDK

理解した。アイドリングリソースに渡すビューを取得するには、ActivityTestRuleのメンバー変数を取得するだけです。

例:

_@Rule
public ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(
        MainActivity.class);
_

そしてgetActivity().findViewById(R.id.viewId)を呼び出します

したがって、最終結果は次のとおりです。

_activityTestRule.getActivity().findViewById(R.id.viewId);
_
29
EGHDK

受け入れられた回答は、同じアクティビティでテストが実行されている限り機能します。ただし、テストが別のアクティビティに移動すると、activityTestRule.getActivity()は間違ったアクティビティ(最初のアクティビティ)を返します。これに対処するには、実際のアクティビティを返すヘルパーメソッドを作成します。

public Activity getCurrentActivity() {
    final Activity[] currentActivity = new Activity[1];
    InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
        @Override
        public void run() {
            Collection<Activity> allActivities = ActivityLifecycleMonitorRegistry.getInstance()
                    .getActivitiesInStage(Stage.RESUMED);
            if (!allActivities.isEmpty()) {
                currentActivity[0] = allActivities.iterator().next();
            }
        }
    });
    return currentActivity[0];
}

そして、それは次のように使用できます:

Activity currentActivity = getCurrentActivity();
if (currentActivity != null) {
    currentActivity.findViewById(R.id.viewId);
}
12
Anatolii

ActivityScenarioRuleandroidx.test.ext.junit.rulesから使用している場合(ActivityTestRuleは「非推奨になり、最終的にはライブラリから削除されるため」)、Activityインスタンスを取得できますfindViewByIdメソッドを呼び出します:

import androidx.test.ext.junit.rules.activityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4

@RunWith(AndroidJUnit4::class) {

    @get: Rule
    var testRule = activityScenarioRule<MainActivity>()

    @Test
    fun mainTestCase() {
        testRule.scenario.onActivity { activity ->
            val view = activity.findViewById<YourView>(R.id.view)
        }
    }
}

IdilingResourcesEspressoを使用したことはありませんが、次の記事をご覧になりましたか:

また、公式を確認してくださいAndroidドキュメント: アイドリングリソース(参照)

あなたの質問に答えるために、

上記のリンクから抜粋した例を次に示します。

コンテキストから始めて、関連するアクティビティのルートビューは、

View rootView = ((Activity)_context).Window.DecorView.FindViewById(Android.Resource.Id.Content);

Raw Androidでは、次のようになります。

View rootView = ((Activity)mContext).getWindow().getDecorView().findViewById(Android.R.id.content)

次に、単純にこれでfindViewByIdを呼び出します

View v = rootView.findViewById(R.id.your_view_id);

これも役に立つかもしれません: コンテキストのないクラスからgetResources()を呼び出す方法?

それが役に立てば幸い

1
piotrek1543