VertxTestContext завершает работу в 4.0.0 - PullRequest
0 голосов
/ 10 марта 2020

В предыдущих версиях я мог развернуть Verticle в следующем коде.

  @BeforeEach
  fun deploy(vertx: Vertx, testContext: VertxTestContext) {
    val web = vertx.deployVerticle(WebVerticle())
    val database = vertx.deployVerticle(DatabaseVerticle())
    CompositeFuture.all(web, database).handler = testContext.succeeding {
      testContext.completeNow()
    }
  }

Но в 4.0.0-SNAPSHOT handler равен val, есть только метод get.

Я пробовал эти методы.


  CompositeFuture.all(web, database).onSuccess {
    testContext.succeeding<Any> {
      testContext.completeNow()
    }
  }

  // Or

  CompositeFuture.all(web, database).onSuccess {
    testContext.completing<Any>()
  }

  // Or

  CompositeFuture.all(web, database).onComplete {
    testContext.succeeding<Any> {
      testContext.completeNow()
    }
  }

Результат: java.util.concurrent.TimeoutException. Он ждал окончания этого метода, и я не знаю, как с ним справиться

Как мне написать код, чтобы получить тот же эффект?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Поскольку вы перешли в список рассылки для пользователей Vert.x, я отвечаю вместо этого.

0 голосов
/ 10 марта 2020

Когда вы пишете свой код в Kotlin, было бы еще проще использовать соответствующие функции "... Await", доступные в модулях:

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-lang-kotlin</artifactId>
  <version>4.0.0-milestone4</version>
</dependency>
<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-lang-kotlin-coroutines</artifactId>
  <version>4.0.0-milestone4</version>
</dependency>

Таким образом, вы включены вместо этого использовать функцию deployVerticleAwait . Но вы должны запустить этот код с сопрограммой. Еще один простой способ - использовать функции расширения для целей выполнения теста, например:

fun Vertx.testAsync(testContext: VertxTestContext, block: suspend CoroutineScope.() -> Unit) {
        CoroutineScope(this.dispatcher()).launch {
            runCatching { block(this) }.onSuccess { testContext.completeNow() }.onFailure { testContext.failNow(it) }
        }
    }

Окончательная функция теста может выглядеть следующим образом:

@Test
internal fun my_test(vertx: Vertx, testContext: VertxTestContext) =
    vertx.testAsync(testContext) {
        // Do some things within this coroutine
    }
...