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应该在这里发挥一些作用......欢迎任何改进。