如何解决如何在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))
}
}
}
但是,ticker
和coScope.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 举报,一经查实,本站将立刻删除。