如何从Espresso中获取视图以传递到IdlingResource?

时间:2016-01-08 18:44:21

标签: java android android-studio android-espresso

我基本上有一个自定义View,它接受​​一个ViewPager构造函数参数。我无法找到真正谈论如何实现它的任何地方。

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

正如您所看到的,它需要IdlingResource,但是当我在我的测试课程中注册findViewById()时,我不确定如何获得我的观点。

我已经尝试了findViewById(),我尝试了当前正在运行的活动,然后在那上面调用var app = angular.module('myApp', []); app.controller('customersCtrl', function($scope, $http, $interval) { $scope.postFunction=function(){ $http({ method:"post", url:"http://127.0.0.1:8000/students/", data:{ "name":"Sidharth", "age":25, "email":"s2@gmail.cp", "dob":"2016-01-07" }, headers: {'Content-Type': 'application/x-www-form-urlencoded'} }).then(function(response){ console.log(response); }); } }); ,没有运气。

任何人都知道在这种情况下该怎么做?

4 个答案:

答案 0 :(得分:27)

想出来。要使视图传递到空闲资源,您所要做的就是获取ActivityTestRule的成员变量

例如:

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

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

所以最终的结果是:

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

答案 1 :(得分:10)

只要测试在同一活动中运行,接受的答案就会起作用。但是,如果测试导航到另一个活动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);
}

答案 2 :(得分:1)

我还没有在IdilingResources中使用过Espresso,但您是否看过这些文章:

另请查看官方Android文档:Idling Resources (reference)

要回答你的问题,

以上是从上面的链接中获取的一个例子:

  

从上下文开始,是根的视图   

可以有相关的活动
View rootView = ((Activity)_context).Window.DecorView.FindViewById(Android.Resource.Id.Content);
     

在原始Android中它看起来像:

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

然后只需在此

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

这可能也很有用:How to call getResources() from a class which has no context?

希望有所帮助

答案 3 :(得分:0)

如果您正在使用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 activityRule = activityScenarioRule<MainActivity>()

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