如何从Espresso内部获得视图以传递到IdlingResource中?

我基本上有一个习惯,需要一个构造函数参数。我找不到任何真正谈论如何实现它的地方。IdlingResourceView

我试图使用这个答案:https://stackoverflow.com/a/32763454/1193321

如您所见,它需要一个 ,但是当我在测试类中注册时,我不确定如何获得我的观点。ViewPagerIdlingResource

我已经尝试过,我尝试过获取当前正在运行的活动,然后调用它,但没有运气。findViewById()findViewById()

有人知道在这种情况下该怎么做吗?


答案 1

想通了。要将视图传递到空闲资源中,您所要做的就是获取 ActivityTestRule 的成员变量

例如:

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

然后只需致电getActivity().findViewById(R.id.viewId)

所以最终结果是:

activityTestRule.getActivity().findViewById(R.id.viewId);

答案 2

只要测试在同一活动中运行,接受的答案就有效。但是,如果测试导航到另一个活动,则将返回错误的活动(第一个活动)。为了解决这个问题,可以创建一个返回实际活动的帮助器方法: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);
}

推荐