我正在为启动设备默认邮件客户端的活动编写JUnit测试。我想验证是否已启动“发送到”活动,然后将单击事件发送到“发送”按钮。

我确实使用意图过滤器设置了一个ActivityMonitor,以便获得有关“发送到”活动的引用。我可以看到在运行测试时出现了send mail活动,但是不幸的是,监视器从未被击中。

这是尝试查找“发送到”活动的单元测试代码:

// register activity monitor for the send mail activity
Instrumentation instrumentation = getInstrumentation();
IntentFilter filter = new IntentFilter(Intent.ACTION_SENDTO);
ActivityMonitor monitor = instrumentation.addMonitor(filter, null, false);

// click on the "Send Feedback" button (use Robotium here)
solo.clickOnButton(0);

// wait for the send mail activity to start
Activity currentActivity = instrumentation.waitForMonitorWithTimeout(monitor, 5000);
assertNotNull(currentActivity);


以下是在应用程序中如何启动“发送到”活动:

Uri uri = Uri.parse("mailto:[email protected]");
Intent i = new Intent(Intent.ACTION_SENDTO, uri);
i.putExtra(Intent.EXTRA_SUBJECT, "Message Title");
i.putExtra(Intent.EXTRA_TEXT, "Hello");
startActivity(i);


目的筛选器设置不正确吗?还是不可能监视项目中未定义的活动?

谢谢你的帮助。

最佳答案

我对此也有疑问,事实证明ActivityMonitor无法正常工作,因为Robotium的单独安装了它自己的监视器。该监视器捕获所有意图,因此永远不会调用您的自定义监视器。

最后,我要做的是先删除独奏监视器,插入我自己的监视器,然后重新添加独奏监视器,以便首先匹配您的监视器。您的代码将如下所示:

// register activity monitor for the send mail activity
Instrumentation instrumentation = getInstrumentation();
IntentFilter filter = new IntentFilter(Intent.ACTION_SENDTO);
ActivityMonitor monitor = new ActivityMonitor(filter, null, false);
ActivityMonitor soloMonitor = solo.getActivityMonitor();

// Remove the solo monitor, so your monitor is first on the list.
instrumentation.removeMonitor(soloMonitor);
// add your own monitor.
instrumentation.addMonitor(monitor);
// Re-add the solo monitor
instrumentation.addMonitor(soloMonitor);

// click on the "Send Feedback" button (use Robotium here)
solo.clickOnButton(0);

// wait for the send mail activity to start
Activity currentActivity = instrumentation.waitForMonitorWithTimeout(monitor, 5000);
assertNotNull(currentActivity);


附带说明:在启动另一个活动(邮件应用程序)时,您失去了对测试环境的控制,因此使监视器处于阻塞状态(即new ActivityMonitor(filter, null, true);)将非常有用。

10-02 23:28