手动等待异步事件时,为什么没有完成此测试?

时间:2018-04-18 16:41:45

标签: java multithreading asynchronous vert.x

为什么测试endlessTest没有结束?

private Vertx vertx;

@Before
public void setUp(TestContext context) throws IOException {
    vertx = Vertx.vertx();
    vertx.deployVerticle(MainVerticle.class.getName(), context.asyncAssertSuccess());
}

@After
public void tearDown(TestContext context) {
    vertx.close(context.asyncAssertSuccess());
}

@Test
public void endlessTest(TestContext context) throws InterruptedException {
    final boolean[] done = {false};
    vertx.createHttpClient().getNow(8080, "localhost", "/ping", response -> {
        context.assertTrue(false);
        done[0] = true;
    });
    while (!done[0]) {
        Thread.sleep(100);
    }
}

它会向控制台吐出SEVERE: java.lang.AssertionError: Expected true,但它一直在运行,直到我手动终止它。为什么不传播异常?

如果我使用Asynccomplete()等待,它会按预期工作:

@Test
public void endlessTest(TestContext context) {
    Async async = context.async();
    vertx.createHttpClient().getNow(8080, "localhost", "/ping", response -> {
        context.assertTrue(false);
        async.complete();
    });
}

测试以java.lang.AssertionError: Expected true失败。

1 个答案:

答案 0 :(得分:0)

您正在事件循环上运行并且您的Thread.sleep()呼叫正在阻止它,因此它无法处理其中的任何其他事件,例如接收对您的http呼叫的响应。

创建Asnyc并在响应中完成它绝对是正确的方法。