BroadcastReceiver 中的 Delagetes.observable 如何进行单元测试?

How can a Delagetes.observable in a BroadcastReceiver be unit tested?

我如何测试 BroadcastReceiver 中的 Delegates.Observable。我需要获取设备的电池电量并检查它是否低于或高于预定义的临界水平,然后使用干净架构的 UseCase 上传到服务器。我使用 observable 只观察变化的状态。

private fun handleIntent(context: Context, intent: Intent) {

    when (intent.action) {

 

        Intent.ACTION_BATTERY_CHANGED -> {

            try {
                val batteryStatus =
                    context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
                val level = batteryStatus?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) ?: -1
                val scale = batteryStatus?.getIntExtra(BatteryManager.EXTRA_SCALE, -1) ?: -1

                 batteryPct = (level / scale.toFloat() * 100).toInt()

                isBatteryBelowCritical = batteryPct > CRITICAL_BATTERY

            } catch (e: Exception) {

            }

        }
    }
}

并且可观察

private var isBatteryBelowCritical by Delegates.observable(false) { _, old, new ->

        //has gone above critical battery value
        if (old && !new) {
            sendAlarmUseCase.sendBatteryAlarm(batteryPct)
        } else if (!old && new) {
            // has gone below critical battery value
            sendAlarmUseCase.sendBatteryAlarm(batteryPct)
        }

    }

我是否必须使用参数或假定旧值来测试当前值?状态是如何测试的?我应该使用参数化测试还是假设以前的值?

您可以使用一种依赖注入并重构检查状态更改的逻辑:

fun notifyOnlyOnChange(initialValue: Boolean, notify: () -> Unit): ReadWriteProperty<Any?, Boolean> =
    Delegates.observable(initialValue) { _, old, new ->
        if (old != new) // your logic can be simplified to this
            notify()
    }

然后你可以像这样在你的 BroadcastReceiver 中使用它:

private var isBatteryBelowCritical by notifyOnlyOnChange(false) { 
    sendAlarmUseCase.sendBatteryAlarm(batteryPct)
}

然后像这样进行单元测试:


@Test
fun `test observers are not notified when value is not changed`() {
    var observable1 by notifyOnlyOnChange(false) { fail() }
    observable1 = false
    var observable2 by notifyOnlyOnChange(true) { fail() }
    observable2 = true
}

@Test
fun `test observers are notified when value is changed`() {
    var notified1 = false
    var observable1 by notifyOnlyOnChange(false) { notified1 = true }
    observable1 = true
    assertTrue(notified1)
    var notified2 = false
    var observable2 by notifyOnlyOnChange(true) { notified2 = true }
    observable2 = false
    assertTrue(notified2)
}