我正在为我的应用程序编写单元测试,我想测试,如果警报被正确取消,但我找不到合适的解决方案来做到这一点。我熟悉使用带有FLAG_NO_CREATE标志的PendingIntent.getBroadcast()来检查警报是否处于活动状态的方法。
我成功地在同一个测试中成功使用了getBroadcast()函数,首先检查是否在应用程序启动时设置了警报,然后检查是否设置了警报,两次都返回预期的布尔值
public void testTimerButtonStartProcess(){
Intent intent = new Intent (appContext, OnAlarmReceiver.class);
intent.putExtra(Scheduler.PERIOD_TYPE, 1);
intent.putExtra(Scheduler.DELAY_COUNT, 0);
intent.setAction(Scheduler.CUSTOM_INTENT_ALARM_PERIOD_END);
boolean alarmUp = (PendingIntent.getBroadcast(appContext, 0, intent,PendingIntent.FLAG_NO_CREATE) != null);
assertFalse("the alarm manager wasnt running when app is lauched", alarmUp);
solo.clickOnView(timerLayout);
instr.waitForIdleSync();
solo.sleep(5000);
alarmUp = (PendingIntent.getBroadcast(appContext, 0, intent,PendingIntent.FLAG_NO_CREATE) != null);
assertTrue("the alarm is set", alarmUp);
}
但是当我尝试以相反的顺序执行此操作时(首先检查警报是否已设置然后再设置 - 如果不再设置),我的测试失败,因为在第二次检查后(应该取消警报时) getBroadcast()返回true(我希望得到假)。
public void testTimerButtonLongPress(){
solo.clickOnView(timerLayout);
instr.waitForIdleSync();
Intent intent = new Intent (appContext, OnAlarmReceiver.class);
intent.putExtra(Scheduler.PERIOD_TYPE, 1);
intent.putExtra(Scheduler.DELAY_COUNT, 0);
intent.setAction(Scheduler.CUSTOM_INTENT_ALARM_PERIOD_END);
boolean alarmUp = (PendingIntent.getBroadcast(appContext, 0, intent,PendingIntent.FLAG_NO_CREATE) != null);
assertTrue("the alarm manager is running", alarmUp);
solo.clickLongOnView(timerLayout, 1500);
instr.waitForIdleSync();
solo.sleep(3000);
alarmUp = (PendingIntent.getBroadcast(appContext, 0, intent,PendingIntent.FLAG_NO_CREATE) != null);
assertFalse("the alarm manager was not running anymore", alarmUp);
}
我也尝试在应用程序取消警报后只使用一次getBroadcast,但我仍然返回true。
与此同时,我确信,警报的取消按预期工作,因为应用程序在“关闭”后停止警报。