如何检查发送的预期意图而不是在Espresso中实际启动活动?

김준호*_*김준호 9 android android-intent android-activity android-espresso android-instrumentation

我有一个UI测试点击按钮,然后在其onClickListener中启动一个新的Activity.该测试检查是否发送了预期意图.

我的问题是,我想测试是否在没有实际启动活动的情况下发送预期意图.因为我发现新活动初始化了它的状态,并且后续测试变得不稳定.

我知道的有两家咖啡意图 API,它是intendedintending,但都不能满足我的需求.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)

希望有所帮助.


김준호*_*김준호 4

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课堂上。