【发布时间】:2018-05-18 00:53:00
【问题描述】:
我目前正在编写一个测试函数,它应该运行一个块或(当达到某个超时时)抛出一个异常。
我在 Kotlin 中尝试使用 Coroutines 进行此操作,但最终混合使用了 Coroutines 和 CompletableFuture:
fun <T> runBlockWithTimeout(maxTimeout: Long, block: () -> T ): T {
val future = CompletableFuture<T>()
// runs the coroutine
launch { block() }
return future.get(maxTimeout, TimeUnit.MILLISECONDS)
}
这可行,但我不确定这是否是在 kotlin 中解决该问题的预期方法。
我也尝试了其他方法:
runBlocking {
withTimeout(maxTimeout) {
block()
}
}
但这似乎不适用于block 调用例如Thread.sleep(...)
那么CompletableFuture 方法是要走的路还是有更好的方法?
更新 1 我想要达到的目标:
异步集成测试代码(如从 RabbitMq 接收数据)应该像这样进行测试:
var rabbitResults: List = ... // are filled async via RabbitListeners
...
waitMax(1000).toSucceed {
assertThat(rabbitResults).hasSize(1)
}
waitMax(1000).toSucceed {
assertThat(nextQueue).hasSize(3)
}
...
【问题讨论】:
-
如果你正在使用一些测试库,它可能已经有超时功能。例如,使用 JUnit,您可以在测试方法上设置
@Test(timeout=5000)注释。 -
我更新了描述,以便更好地理解我想要实现的目标。