我基本上有一个自定义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);
});
}
});
,没有运气。
任何人都知道在这种情况下该怎么做?
答案 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)
要回答你的问题,
最好的方法是将其中一个视图的实例传入类的构造函数中。检查:Calling findViewById() from outside an activity
另一种方式是按上下文查看。查看android - How to get view from context?
以上是从上面的链接中获取的一个例子:
从上下文开始,是根的视图
可以有相关的活动View rootView = ((Activity)_context).Window.DecorView.FindViewById(Android.Resource.Id.Content);
在原始Android中它看起来像:
View rootView = ((Activity)mContext).getWindow().getDecorView().findViewById(android.R.id.content)
然后只需在此
上调用findViewByIdView 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)
}
}
}