首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android Kotlin协程UnitTesting

Android Kotlin协程UnitTesting
EN

Stack Overflow用户
提问于 2019-06-11 02:23:23
回答 1查看 1.1K关注 0票数 3

我有一个启动协程的broadcastReceiver,我正在尝试对它进行单元测试……

广播:

代码语言:javascript
复制
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)
    }
}

下面是测试结果:

代码语言:javascript
复制
@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并在测试中控制它。可惜,我不知道声明协程作用域的约定是什么。

EN

回答 1

Stack Overflow用户

发布于 2019-06-11 23:11:27

是的,就像Rodrigo Queiroz提到的,运行阻塞将解决这个问题。

代码语言:javascript
复制
@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())
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56531647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档