Asynchronous 使用Vertx unit在回调中使单元测试失败的正确方法
给定以下单元测试,它使用Vertx单元测试框架: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
@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
处理