You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 03:45:09