Asynchronous 使用Vertx unit在回调中使单元测试失败的正确方法

Asynchronous 使用Vertx unit在回调中使单元测试失败的正确方法,asynchronous,junit,junit4,vert.x,vertx-verticle,Asynchronous,Junit,Junit4,Vert.x,Vertx Verticle,给定以下单元测试,它使用Vertx单元测试框架: @RunWith(VertxUnitRunner.class) public class VertxUnitTest { private Vertx vertx; @Rule public RunTestOnContext rule = new RunTestOnContext(new VertxOptions().setClustered(false) .setClusterManager(n

给定以下单元测试,它使用Vertx单元测试框架:

@RunWith(VertxUnitRunner.class)
public class VertxUnitTest {

    private Vertx vertx;

    @Rule
    public RunTestOnContext rule = new RunTestOnContext(new VertxOptions().setClustered(false)
            .setClusterManager(new HazelcastClusterManager()).setMaxEventLoopExecuteTime(2000000000000L)
            .setMaxWorkerExecuteTime(60000000000000L).setBlockedThreadCheckInterval(1000000)
            .setEventBusOptions(new EventBusOptions().setClustered(false).setIdleTimeout(0)));

    @Before
    public void setup() throws Exception {
        io.vertx.core.Vertx v = rule.vertx();
        vertx = Vertx.newInstance(v);
    }

    private class MyVerticle extends AbstractVerticle {}

    @Test
    public void runFlow_correctMessage_stepsCalledInCorrectOrder(TestContext context) {
        Async async = context.async();

        vertx.getDelegate().deployVerticle(new MyVerticle(), new DeploymentOptions().setWorker(true), c -> {
            c.cause();
            vertx.eventBus().<Object>send("", new JsonObject(), new DeliveryOptions(), rpl -> {
                async.complete();
                fail();

            });
        });
    }
}
@RunWith(VertxUnitRunner.class)
公共类VertxUnitTest{
私有Vertx-Vertx;
@统治
public RunTestOnContext rule=new RunTestOnContext(new VertxOptions().setClustered(false)
.setClusterManager(新的HazelcastClusterManager()).setMaxEventLoopExecuteTime(2000000000L)
.setMaxWorkerExecuteTime(6000000000000L).setBlockedThreadCheckInterval(1000000)
.setEventBusOptions(新的EventBusOptions().setClustered(false).setIdleTimeout(0));
@以前
public void setup()引发异常{
io.vertx.core.vertx v=rule.vertx();
vertx=vertx.newInstance(v);
}
私有类MyVerticle扩展了AbstractVerticle{}
@试验
public void runFlow\u correctMessage\u stepscaledincorrector(TestContext上下文){
Async Async=context.Async();
getDelegate().deployVerticle(新的MyVerticle(),新的DeploymentOptions().setWorker(true),c->{
c、 原因();
vertx.eventBus().send(“),new JsonObject(),new DeliveryOptions(),rpl->{
async.complete();
失败();
});
});
}
}
调用
fail()
会向控制台抛出一个异常,但实际上它并没有使测试本身失败,测试成功完成,并且是绿色的

使用Mockito时也是如此。我可以使用mock成功地验证verticle及其依赖项的行为,但即使Mockito断言失败,测试本身也会通过。对vertx TestContext对象调用fail-
context.fail()
-也不会使测试失败

核心问题是:在
async.complete()
之后调用
fail()
不会使测试失败,只有控制台会显示错误。但是如果没有对
async.complete()
的调用,在调用测试断言之前,verticle中的代码(从事件总线调用)将不会运行

如果不调用
async.complete()
,测试将无法完成

正确的做法是什么


谢谢

正确的方法是调用
TestContext.fail()
方法,如下所示:

@Test
public void runFlow_correctMessage_stepsCalledInCorrectOrder(TestContext context) {
    Async async = context.async();

    vertx.getDelegate().deployVerticle(new MyVerticle(), new DeploymentOptions().setWorker(true), c -> {
        if(c.succeeded()) {
            vertx.eventBus().<Object>send("", new JsonObject(), new DeliveryOptions(), rpl -> {
                if(rpl.succeeded()) {
                    // make assertions based on reply contents, and then...
                    async.complete();

                } else {
                    context.fail(rpl.cause());
                }
            });

        } else {
            context.fail(c.cause());
        }
    });
}
@测试
public void runFlow\u correctMessage\u stepscaledincorrector(TestContext上下文){
Async Async=context.Async();
getDelegate().deployVerticle(新的MyVerticle(),新的DeploymentOptions().setWorker(true),c->{
如果(c.successed()){
vertx.eventBus().send(“),new JsonObject(),new DeliveryOptions(),rpl->{
if(rpl.successed()){
//根据回复内容做出断言,然后。。。
async.complete();
}否则{
context.fail(rpl.cause());
}
});
}否则{
失败(c.cause());
}
});
}

您是否可以展开您的答案,以显示在事件总线上发送消息的代码(以及相关的回调)应该放在哪里。我的测试在与发送到事件总线相关联的回调中。核心问题是:在async.complete()之后对fail()的任何调用都不会使测试失败,只有控制台会显示错误。但是如果没有对async.complete()的调用,verticle中的代码(从事件总线调用)将无法在调用测试断言之前运行。很抱歉,我忽略了您最初文章的这一部分。我已经更新了答案,以反映嵌套的
EventBus
处理