1
Ich schreibe einige Java Vertex asynch Code mit Kotlin Korotinen zu Lernzwecken. Wenn ich jedoch versuche, einen einfachen HTTP-Aufruf zu testen, hängt der Coroutine-basierte Test für immer und ich verstehe wirklich nicht, wo das Problem liegt. Hier ein Reproduzierer:Vertex Plus Kotlin Koroutinen hängt für immer
@RunWith(VertxUnitRunner::class)
class HelloWorldTest {
private val vertx: Vertx = Vertx.vertx()
@Before
fun setUp(context: TestContext) {
// HelloWorldVerticle is a simple http server that replies "Hello, World!" to whatever call
vertx.deployVerticle(HelloWorldVerticle::class.java!!.getName(), context.asyncAssertSuccess())
}
// ORIGINAL ASYNC TEST HERE. IT WORKS AS EXPECTED
@Test
fun testAsync(context: TestContext) {
val atc = context.async()
vertx.createHttpClient().getNow(8080, "localhost", "/") { response ->
response.handler { body ->
context.assertTrue(body.toString().equals("Hello, World!"))
atc.complete()
}
}
}
// First attempt, it hangs forever, the response is never called
@Test
fun testSync1(context: TestContext) = runBlocking<Unit> {
val atc = context.async()
val body = await<HttpClientResponse> {
vertx.createHttpClient().getNow(8080, "localhost", "/", { response -> response.handler {it}})
}
context.assertTrue(body.toString().equals("Hello, World!"))
atc.complete()
}
// Second attempt, it hangs forever, the response is never called
@Test
fun testSync2(context: TestContext) = runBlocking<Unit> {
val atc = context.async()
val response = await<HttpClientResponse> {
vertx.createHttpClient().getNow(8080, "localhost", "/", it)
}
response.handler { body ->
context.assertTrue(body.toString().equals("Hello, World!"))
atc.complete()
}
}
suspend fun <T> await(callback: (Handler<T>) -> Unit) =
suspendCoroutine<T> { cont ->
callback(Handler { result: T ->
cont.resume(result)
})
}
}
Ist jeder in der Lage, das Problem herauszufinden?
ich Ihre Antwort akzeptiert, weil das Problem in der Tat war in der Ereignisschleife zu blockieren; Ihr Punkt 1 ist jedoch falsch, in der Tat stellt context.asyncAssertSuccess() in der Methode setUp() sicher, dass die Tests nur ausgeführt werden, wenn der Server bereit ist. –