0

我一直在写一个测试类:

class TestVerticle {

  @BeforeEach
  fun deploy_verticle(vertx: Vertx, testContext: VertxTestContext) {
    vertx.deployVerticle(Verticle(), testContext.completing())
  }

  @Test
  fun test(vertx: Vertx, testContext: VertxTestContext) {
    testContext.verify {
      GlobalScope.launch(vertx.dispatcher()) {

        val reply = vertx.eventBus().requestAwait<Long>(AVIOEXTDMZAddr, "1")

        assert(reply.body() == 1010L)
        testContext.completeNow()
      }

    }
  }
}

如果 Verticle 的方法 start() 以“普通”方式编写,则 Test 肯定通过:

override suspend fun start() { 
   vertx.eventBus().consumer<String>(AVIOEXTDMZAddr){
         it.reply(1010L) 
      }
    }

不同的是,如果我使用 vertx-lang-kotlin-coroutines API 实现不同的解决方案,测试会抛出 java.util.concurrent.TimeoutException

override suspend fun start() { 
 val consumerChannel = vertx.eventBus().consumer<String>(AVIOEXTDMZAddr).toChannel(vertx)
    for (msg in consumerChannel) {
        msg.reply(1010L)
      }
    }

我究竟做错了什么?

4

1 回答 1

1

通道上的循环阻塞协程。在这种情况下,它会阻止您的verticle的开始。

包裹你for looplaunch块:

async {
    for (msg in consumerChannel) {
        msg.reply(1010L)
      }
    }
}
于 2020-02-14T13:04:34.187 回答