ActivityMonitor в фильтре намерений ACTION_SENDTO не ударил - PullRequest
2 голосов
/ 08 февраля 2012

Я пишу тест JUnit для действия, которое запускает почтовый клиент устройства по умолчанию. Я хочу проверить, что действие «Отправить» запущено, а затем отправить событие нажатия на кнопку «Отправить».

Я настроил ActivityMonitor с фильтром намерений, чтобы получить ссылку на действие «Отправить». Я вижу, как во время выполнения теста появляется сообщение об отправке почты, но, к сожалению, монитор никогда не срабатывает.

Вот код модульного теста, который пытается найти действие «Отправить»:

// 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:address@mail.com");
Intent i = new Intent(Intent.ACTION_SENDTO, uri);                                   
i.putExtra(Intent.EXTRA_SUBJECT, "Message Title");        
i.putExtra(Intent.EXTRA_TEXT, "Hello");
startActivity(i);

Правильно ли установлен фильтр намерений? Или невозможно отслеживать действия, которые не определены в проекте?

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 13 мая 2014

У меня тоже были проблемы с этим, и оказалось, что 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);)

0 голосов
/ 27 января 2014

У меня была та же проблема с моими тестами, и это сработало для меня.

В этот момент ваш тест работает нормально, но ваш монитор не знает, какие данные ожидать, поэтому ваш фильтр намерений непоймать что-нибудь.

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


//Here you just need to say to your intent filter what exactly to look for 
filter.addDataType(CommonDataKinds.Email.CONTENT_TYPE);



ActivityMonitor monitor = instrumentation.addMonitor(filter, null, true);
// 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);

если вы сделаете это для отправки смс, эта строка будет:

filter.addDataScheme(Constants.SCHEME_SMS);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...