如何正确测试带延迟的无限协程循环

Mil*_*tos 7 android delay while-loop kotlin-coroutines

我有一个无限运行的协程函数,并且每 8 秒进行一次 API 调用。我正在尝试测试它,但感觉有些不对劲。这是代码:

class RefreshStocksUseCaseImpl(
    private val dispatcherProvider: DispatcherProvider,
    private val stocksRepository: StocksRepository
) : RefreshStocksUseCase {

    override suspend fun invoke() {
        withContext(dispatcherProvider.io) {
            try {
                while (true) {
                    stocksRepository.refreshStocks()
                    delay(THRESHOLD)
                }
            } catch (t: Throwable) {
                // We could make some extra handling here.
                throw t
            }
        }
    }

    companion object {

        private const val THRESHOLD = 8_000L // 8 seconds
    }
}
Run Code Online (Sandbox Code Playgroud)

我的测试看起来像这样:

@ExperimentalCoroutinesApi
class RefreshStocksUseCaseImplTest {

    private lateinit var useCase: RefreshStocksUseCase

    private val dispatcherProvider = TestDispatcherProvider()

    @MockK
    private lateinit var stocksRepository: StocksRepository

    @Before
    fun setup() {
        MockKAnnotations.init(this, relaxUnitFun = false)
        useCase = RefreshStocksUseCaseImpl(dispatcherProvider, stocksRepository)
    }

    @Test
    fun `refreshStocks is called again after threshold`() = dispatcherProvider.io.runBlockingTest {
        coEvery { stocksRepository.refreshStocks() } just runs

        val job = launch {
            useCase()
        }
        advanceTimeBy(8_000)

        job.cancel()
        coVerify(exactly = 2) { stocksRepository.refreshStocks() }
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然过去了,但我还是觉得自己做错了什么。我觉得pauseDispatcher应该在这里发挥一些作用......欢迎任何改进。