Как можно протестировать Delagetes.observable в BroadcastReceiver?
Как я могу протестировать Delegates.Observable, который находится внутри BroadcastReceiver. Мне нужно получить уровень заряда батареи устройства и проверить, не упал ли он ниже или выше заранее определенного критического уровня, и загрузить на сервер с использованием UseCase чистой архитектуры. Я использовал наблюдаемое, чтобы наблюдать только изменяющиеся состояния.
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 ->
// Just went above critical battery value
if (old && !new) {
sendAlarmUseCase.sendBatteryAlarm(batteryPct)
} else if (!old && new) {
// Just went below critical battery value
sendAlarmUseCase.sendBatteryAlarm(batteryPct)
}
}
Должен ли я использовать параметры или принимать старое значение для проверки текущего значения? Как проверяется состояние? Должен ли я использовать параметризованный тест или принять предыдущее значение?
0 ответов
Вы можете использовать своего рода внедрение зависимостей и реорганизовать логику, которая проверяет изменение состояния:
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)
}
И unit test это так:
@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)
}