如何在KotlinAndroid中定义可测试的计时器循环?

问题描述

我想要一个周期性的计时器循环(例如1秒间隔)。有很多方法可以做到这一点,但是我还没有找到适合单元测试的解决方案。

  • 计时器应该精确
  • 单元测试应该能够跳过等待状态

我最接近解决方案的是使用协程:使用[Fact] public void CanCheckAllInOneGo() { varerror = false; foreach (var a in TestData()) { error |= doSomething((bool)a[0],(bool)a[1]); } Assert.True(error != true,"doSomething() Failed"); } task loadDependencies(type: Exec) { doLast { configurations.each { config -> config.files() } } } delay的简单循环。

runBlockingTest

advanceTimeBy

它在某种程度上可以工作,但是计时器不精确,因为它不考虑执行时间。

我没有找到一种方法查询协程范围中使用的内部计时器或coScope.launch { while (isActive) { // do stuff delay(1000L) } } 中的剩余超时值:

@Test
fun timer_test() = coScope.runBlockingTest {
    ... // start job
    advanceTimeBy(9_000L)
    ... // cancel job
}

一个想法是使用withTimeoutOrNull

coScope.launch {
    withTimeoutOrNull(999_000_000L) {  // max allowed looping time
        while (isActive) {
            // do stuff
            val timeoutLeft // How to get that value ???
            delay(timeoutLeft.mod(1000L))
        }
    }
}

但是,tickercoScope.launch { val tickerChannel = ticker(1000L,0L,coroutineContext) var referenceTimer = 0L for (event in tickerChannel) { // do stuff println(referenceTimer) referenceTimer += 1000L } } 间的连接不会产生正确的结果:

TestCoroutinedispatcher()

一致地导致:

ticker

我也愿意接受满足上述两点的其他方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)