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

Ely*_*lye 7 unit-testing kotlin kotlin-coroutines

我有这个功能

    override fun trackEvent(trackingData: TrackingData) {
        trackingData.eventsList()
    }
Run Code Online (Sandbox Code Playgroud)

我可以进行如下测试。

    @Test
    fun `My Test`() {
        // When
        myObject.trackEvent(myTrackingMock)

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

Run Code Online (Sandbox Code Playgroud)

但是,如果我把它变成一个

    override fun trackEvent(trackingData: TrackingData) {
        GlobalScope.launch{
            trackingData.eventsList()
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*nik 3

要找到答案,请尝试提出一个相关问题:“我如何对具有以下功能的函数进行单元测试:

Thread { trackingData.eventsList() }
Run Code Online (Sandbox Code Playgroud)

在里面?”

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

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

也许最好的办法是重写代码以使用您控制下的范围。