김준호*_*김준호 9 android android-intent android-activity android-espresso android-instrumentation
我有一个UI测试点击按钮,然后在其onClickListener中启动一个新的Activity.该测试检查是否发送了预期意图.
我的问题是,我想测试是否在没有实际启动活动的情况下发送预期意图.因为我发现新活动初始化了它的状态,并且后续测试变得不稳定.
我知道的有两家咖啡意图 API,它是intended和intending,但都不能满足我的需求.intendedapi实际上启动了目标活动,intendingapi没有启动活动,但是它调用了onActivityResult我不想要的回调.因为我担心里面的代码onActivityResult可能会导致另一种瑕疵.也intending没有断言是否发送匹配意图,它只是onActivityResult在找到匹配意图时调用回调,这意味着我必须检查是否onActivityResult被调用!
有没有什么干净的方法来实现我想要的?
FOM*_*per 11
如果要测试是否在未实际启动活动的情况下发送预期意图,可以通过使用activityResult捕获意图然后捕获活动来执行此操作:
Intent intent = new Intent();
ActivityResult intentResult = new ActivityResult(Activity.RESULT_OK,intent);
intending(anyIntent()).respondWith(intentResult);
onView(withId(R.id.view_id_to_perform_clicking)).check(matches(isDisplayed())).perform(click());
intended(allOf(hasComponent(ActivityToBeOpened.class.getName())));
Run Code Online (Sandbox Code Playgroud)
这将捕获任何启动ActivityToBeOpened的尝试.如果您想要更具体,您还可以使用Extras捕获意图:
intended(allOf(hasComponent(ActivityToBeOpened.class.getName()), hasExtra("paramName", "value")));
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
Espresso 的Intents类是一个简洁且方便的 api,但是当它不能满足您的需求时,还有一个替代方案。如果您使用AndroidJUnit4测试运行程序,则可以Instrumentaion使用 获取实例InstrumentationRegistry.getInstrumentation(),然后可以添加Instrumentation.ActivityMonitor实例。
Instrumentation.ActivityMonitor am = new Instrumentation.ActivityMonitor("YOUR_ACTIVITY", null, true);
InstrumentationRegistry.getInstrumentation().addMonitor(am);
onView(withId(R.id.view_id_to_perform_clicking)).check(matches(isDisplayed())).perform(click());
assertTrue(InstrumentationRegistry.getInstrumentation().checkMonitorHit(am, 1));
Run Code Online (Sandbox Code Playgroud)
构造函数的第三个参数ActivityMonitor告诉我们要阻止活动启动。请注意,这种方法有其局限性。与 Espresso Intents丰富的 Matcher 支持相反,您不能为 设定多个条件ActivityMonitor。
您可以在ApiDemos中找到多个示例,尤其是在ContactsSelectInstrumentation课堂上。
| 归档时间: |
|
| 查看次数: |
5909 次 |
| 最近记录: |