unit-testing - 如何对具有协程 `GlobalScope.launch` 的函数进行单元测试

标签 unit-testing kotlin kotlin-coroutines

我有这个功能

    override fun trackEvent(trackingData: TrackingData) {
        trackingData.eventsList()
    }

我可以进行如下测试。
    @Test
    fun `My Test`() {
        // When
        myObject.trackEvent(myTrackingMock)

        // Then
        verify(myTrackingMock, times(1)).eventsList()
    }


但是,如果我把它变成一个
    override fun trackEvent(trackingData: TrackingData) {
        GlobalScope.launch{
            trackingData.eventsList()
        }
    }

我怎么能让我的测试继续运行? (即可以使 launch 同步?)

最佳答案

要接近答案,请尝试提出一个相关问题:“我将如何对具有

Thread { trackingData.eventsList() }

在里面?”

您唯一的希望是运行一个循环,在一段时间内反复检查预期条件,直到放弃并宣布测试失败。

当您写信时 GlobalScope.launch ,您放弃了对 Kotlin 结构化并发的兴趣,因此您将不得不求助于非结构化和非确定性的测试方法。

另一方面,也许您实际上并不想使用 GlobalScope ,但只是不知道更好?在这种情况下,重写您的代码以使用您控制的范围。

关于unit-testing - 如何对具有协程 `GlobalScope.launch` 的函数进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57489674/

相关文章:

javascript - 依赖注入(inject)非实例化对象的优点和缺点

kotlin - 如何处理对话框中的取消和确定按钮

android - 如何在kotlin语言中将char转换为ascii值

android - Kotlin Android Studio 在调用另一个函数之前等待一个函数完成

kotlin-coroutines - 我什么时候应该使用 `Dispatchers.Unconfined` 和 `EmptyCoroutineContext` ?

kotlin - @LastModifiedBy在协程内部不起作用

ios - 从 CLI 运行 swift 测试时,我可以指定平台目标吗?

c# - 如何使用 Moq 为不同的参数设置方法两次

android - 更新 Robolectric 2.4 : Getting application tag error for library projects in eclipse

gradle - 调试库