【发布时间】:2019-12-04 20:12:27
【问题描述】:
背景:
在使用 VertX 从 JUnit4 迁移到 JUnit5 期间,我阅读了迁移指南,其中解释了:
- 如何使用更改后的
Promise和FutureVertx 接口 - 如何在 Vertx 测试中
VertxTestContext、Vertx自动注入 - 如何使用
testContext.awaitCondition()、textContext.completing()、testContext.completeNow()等
考虑到这些信息,我编写了以下测试:
测试代码:
import io.vertx.core.Promise;
import io.vertx.core.Future;
@ExtendWith(VertxExtension.class)
class RestApiTest {
@BeforeAll
static void setUpMongoDatabase() throws IOException {
(...)
}
@BeforeEach
void setUp(Vertx vertx, VertxTestContext ctx) {
vertx.deployVerticle(ApiVerticle.class.getName(), options, ctx.completing());
return WebClient.create(vertx);
}
@AfterEach
void tearDown(Vertx vertx, VertxTestContext testContext) {
assertThat(vertx.deploymentIDs().size(), is(equalTo(2)));
}
@AfterAll
static void stopMongoDatabase() {
(...)
}
@Test
void test(Vertx vertx, VertxTestContext testContext) {
Future<Void> insertFuture = insertTestData();
future.setHandler(testContext.completing());
// This ether throws a TimeoutException or does not block until the insert completed
testContext.awaitCompletion(5, TimeUnit.SECONDS);
// assert
mongoClient.findOne(COLLECTION, QUERY, result -> {
if (result.succeeded()) testContext.completeNow();
else testContext.failNow();
});
}
Future<Void> insertTestData() {
Promise<Void> promise = Promise.promise();
Future<Void> future = promise.future();
mongoClient.insert(COLLECTION, QUERY, result -> {
if (result.succeeded()) {
promise.complete();
} else {
promise.fail();
}
});
return future;
}
}
问题:
- testContext.awaitCompletion() ether 抛出
TimeoutException - 或在异步插入完成之前不会阻塞以便我的断言成功返回
问题:
- 如何等待异步 mongo 查询完成,然后再继续测试?
【问题讨论】:
标签: mongodb promise async-await vert.x junit5