我有一个启动协程的broadcastReceiver,我正在尝试对它进行单元测试……
广播:
class AlarmBroadcastReceiver: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Timber.d("Starting alarm from broadcast receiver")
//inject(context) Don't worry about this, it's mocked out
GlobalScope.launch {
val alarm = getAlarm(intent)
startTriggerActivity(alarm, context)
}
}
private suspend fun getAlarm(intent: Intent?): Alarm {
val alarmId = intent?.getIntExtra(AndroidAlarmService.ALARM_ID_KEY, -1)
if (alarmId == null || alarmId < 0) {
throw RuntimeException("Cannot start an alarm with an invalid ID.")
}
return withContext(Dispatchers.IO) {
alarmRepository.getAlarmById(alarmId)
}
}
下面是测试结果:
@Test
fun onReceive_ValidAlarm_StartsTriggerActivity() {
val alarm = Alarm().apply { id = 100 }
val intent: Intent = mock {
on { getIntExtra(any(), any()) }.thenReturn(alarm.id)
}
whenever(alarmRepository.getAlarmById(alarm.id)).thenReturn(alarm)
alarmBroadcastReceiver.onReceive(context, intent)
verify(context).startActivity(any())
}
发生的情况是,我正在验证的函数从未被调用过。测试在协程返回之前结束...我知道GlobalScope
不好用,但我不确定还能怎么做。
编辑1:如果我在verify
之前设置一个延迟,它似乎可以工作,因为它让协程有时间完成并返回,但是,我不想让测试依赖于延迟/睡眠……我认为解决方案是适当地引入作用域,而不是使用GlobalScope
并在测试中控制它。可惜,我不知道声明协程作用域的约定是什么。
发布于 2019-06-11 23:11:27
是的,就像Rodrigo Queiroz提到的,运行阻塞将解决这个问题。
@Test
fun onReceive_ValidAlarm_StartsTriggerActivity() = runBlockingTest {
val alarm = Alarm().apply { id = 100 }
val intent: Intent = mock {
on { getIntExtra(any(), any()) }.thenReturn(alarm.id)
}
whenever(alarmRepository.getAlarmById(alarm.id)).thenReturn(alarm)
alarmBroadcastReceiver.onReceive(context, intent)
verify(context).startActivity(any())
}
https://stackoverflow.com/questions/56531647
复制相似问题