0

有一个静态函数isNotificationsEnabled ,它在通道 for 循环中有一个 if 块来检查通知通道是否有:

class Utils {

    @NonNull
    static List<NotificationChannel> getNotificationChannels(NotificationManagerCompat nm) {       
        return nm.getNotificationChannels();
    }

    static boolean isNotificationsEnabled(@NonNull Context context) {
        NotificationManagerCompat nm = NotificationManagerCompat.from(context);
        boolean enabled = nm.areNotificationsEnabled();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {          
            if (enabled) {
                List<NotificationChannel> channels = getNotificationChannels(nm);
                boolean someChannelEnabled = channels.isEmpty();
              
                for (NotificationChannel channel : channels) {//need non empty channels in order to run the if block
                    if (channel.getImportance() != NotificationManagerCompat.IMPORTANCE_NONE) {
                        someChannelEnabled = true;
                        break;
                    }
                }
                enabled = enabled && someChannelEnabled;
            }
        } 
        return enabled;
    }
}

试图有另一个静态函数getNotificationChannels来返回频道列表,并进行以下测试,但它不起作用。

    @Test
    public void test_ isNotificationsEnabled() {
        boolean enabled = NotificationManagerCompat.from(application).areNotificationsEnabled();
        Utils spy = Mockito.spy(new Utils());

        List<NotificationChannel> channelList = new ArrayList<>();
        channelList.add(new NotificationChannel("0", "channel_0", NotificationManager.IMPORTANCE_HIGH));
        channelList.add(new NotificationChannel("1", "channel_1", NotificationManager.IMPORTANCE_HIGH));

        doReturn(channelList).when(spy).getNotificationChannels(NotificationManagerCompat.from(application));
        boolean b = spy.isNotificationsEnabled(application);
        assertEquals(b, enabled);
        
    }

显然

doReturn(channelList).when(spy).getNotificationChannels(NotificationManagerCompat.from(application));

不起作用。如何测试 if 块?

            if (channel.getImportance() != NotificationManagerCompat.IMPORTANCE_NONE) {
                    someChannelEnabled = true;
                    break;
            }
4

1 回答 1

0

更改函数以获取 NotificatioonManager:

static boolean isNotificationsEnabled(@NonNull Context context, NotificationManagerCompat nm) {
        boolean enabled = nm.areNotificationsEnabled();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {          
            if (enabled) {
                List<NotificationChannel> channels = getNotificationChannels(nm);
                boolean someChannelEnabled = channels.isEmpty();
              
                for (NotificationChannel channel : channels) {//need non empty channels in order to run the if block
                    if (channel.getImportance() != NotificationManagerCompat.IMPORTANCE_NONE) {
                        someChannelEnabled = true;
                        break;
                    }
                }
                enabled = enabled && someChannelEnabled;
            }
        } 
        return enabled;
    }

需要将模拟传递给测试中的函数:

        List<NotificationChannel> channelList = new ArrayList<>();
        channelList.add(new NotificationChannel("0", "channel_0", NotificationManager.IMPORTANCE_NONE));
        channelList.add(new NotificationChannel("1", "channel_1", NotificationManager.IMPORTANCE_HIGH));

        NotificationManagerCompat nmSpy = Mockito.spy(NotificationManagerCompat.from(application));
        when(nmSpy.getNotificationChannels()).thenReturn(channelList);

        boolean b = Utils.isNotificationsEnabled(application, nmSpy);
        assertEquals(b, enabled);

于 2021-05-31T00:21:06.947 回答