Android Kotlin定时推送通知测试用例:求AlarmManager相关测试脚本示例
Android AlarmManager + BroadcastReceiver 定时通知测试脚本示例
一、本地单元测试(验证Alarm设置逻辑)
用JUnit + Mockito模拟系统服务,快速验证Alarm调度逻辑是否正确,无需依赖真机/模拟器。
import static org.mockito.Mockito.*; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class AlarmSchedulerTest { @Mock private Context mockContext; @Mock private AlarmManager mockAlarmManager; private AlarmScheduler alarmScheduler; // 替换为你实际的Alarm调度类 @Before public void setUp() { when(mockContext.getSystemService(Context.ALARM_SERVICE)).thenReturn(mockAlarmManager); alarmScheduler = new AlarmScheduler(mockContext); } @Test public void testSetExactAlarm() { // 模拟10秒后的触发时间 long triggerTime = System.currentTimeMillis() + 10000; Intent intent = new Intent(mockContext, NotificationReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast( mockContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); // 调用你封装的Alarm设置方法 alarmScheduler.setExactAlarm(triggerTime); // 验证AlarmManager是否被正确调用 verify(mockAlarmManager).setExactAndAllowWhileIdle( eq(AlarmManager.RTC_WAKEUP), eq(triggerTime), eq(pendingIntent) ); } }
二、Instrumented测试(验证通知实际触发)
在真机或模拟器上运行,验证BroadcastReceiver是否能接收Alarm广播并发送通知。
1. 依赖配置(app/build.gradle)
androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test:rules:1.5.0'
2. 测试类代码
import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import android.app.AlarmManager; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.LargeTest; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @LargeTest public class NotificationAlarmIntegrationTest { private Context context; private NotificationManager notificationManager; @Before public void setUp() { context = getApplicationContext(); notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // 测试前清除所有现有通知,避免干扰 notificationManager.cancelAll(); } @Test public void testAlarmTriggersNotification() throws InterruptedException { // 构建指向你的BroadcastReceiver的PendingIntent Intent intent = new Intent(context, NotificationReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast( context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); // 设置1秒后触发的Alarm(用ELAPSED_REALTIME_WAKEUP适合测试场景) AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); long triggerTime = SystemClock.elapsedRealtime() + 1000; alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, pendingIntent); // 等待Alarm触发和通知发送 Thread.sleep(1500); // 验证通知是否生成 Notification[] activeNotifications = notificationManager.getActiveNotifications(); assertThat(activeNotifications.length, org.hamcrest.Matchers.greaterThan(0)); Notification targetNotification = activeNotifications[0]; assertThat(targetNotification.extras.getString(Notification.EXTRA_TITLE), notNullValue()); assertThat(targetNotification.extras.getString(Notification.EXTRA_TEXT), notNullValue()); } }
三、测试关键注意事项
- 单元测试仅验证Alarm设置逻辑,不会触发实际通知
- Instrumented测试需注意:Android 13+需申请
POST_NOTIFICATIONS权限,测试前可手动授予或通过代码动态申请 - 测试重复Alarm时,可多次触发并验证通知数量是否符合预期
- 若测试Doze模式下的Alarm触发,需在测试代码中模拟Doze状态(需系统权限,适合真机测试)
内容的提问来源于stack exchange,提问作者theanh tran
相关产品推荐
相关产品推荐

