私は基本的に、IdlingResource
コンストラクタ引数を取るカスタムView
を持っています。それを実装する方法について本当に話しているところはどこにも見つかりません。
私はこの答えを使用しようとしています: https://stackoverflow.com/a/32763454/1193321
ご覧のとおり、ViewPager
が必要ですが、テストクラスにIdlingResource
を登録しているときに、ビューを取得する方法がわかりません。
私はfindViewById()
を試しましたが、現在実行中のアクティビティを取得してから、その上でfindViewById()
を呼び出しましたが、運がありませんでした。
誰もがこのシナリオで何をすべきか知っていますか?
理解した。アイドリングリソースに渡すビューを取得するには、ActivityTestRuleのメンバー変数を取得するだけです。
例:
_@Rule
public ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(
MainActivity.class);
_
そしてgetActivity().findViewById(R.id.viewId)
を呼び出します
したがって、最終結果は次のとおりです。
_activityTestRule.getActivity().findViewById(R.id.viewId);
_
受け入れられた回答は、同じアクティビティでテストが実行されている限り機能します。ただし、テストが別のアクティビティに移動すると、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);
}
ActivityScenarioRule
をandroidx.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)
}
}
}
IdilingResources
でEspresso
を使用したことはありませんが、次の記事をご覧になりましたか:
また、公式を確認してくださいAndroidドキュメント: アイドリングリソース(参照)
あなたの質問に答えるために、
これを行う最良の方法は、いずれかのビューのインスタンスをクラスのコンストラクターに渡すことです。チェック: アクティビティの外部からfindViewById()を呼び出す
別の方法は、コンテキスト別に表示することです。チェック 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()を呼び出す方法?
それが役に立てば幸い