【问题标题】:How to write Junit test case for start method of consumer Verticle in vert.x?如何在vert.x中为消费者Verticle的启动方法编写Junit测试用例?
【发布时间】:2020-04-02 04:13:36
【问题描述】:

如下所述,我已经实现了一个 Verticle。 Verticle 按预期工作。现在我正在尝试为这个 Verticle 编写 Junit 测试用例,它可以测试 start 方法、处理程序方法 handleRequest() 以及返回 Future 的处理程序内部的方法 getSomeData()。测试所有三种方法的单个测试用例或测试单个方法的单个测试用例都应该没问题。 我知道为同步代码编写 Junit 测试用例,但不知道如何在异步的 vert.x 中为 Verticle 编写 Junit TC。有人可以在这里指导我吗?我也有路由器verticle,我从它向这个消费者verticle MyVerticle 发送消息,但我想先为这个消费者verticle 编写Jnuit 测试用例。请帮忙。

@Component
public class MyVerticle extends AbstractVerticle{

@Override
public void start() throws Exception {
    super.start();
    vertx.eventBus().<String>consumer("address.xyz").handler(handleRequest());
}

private Handler<Message<String>> handleRequest() {
    return msg -> {
        getSomeData(msg.body().toString())
        .setHandler(ar -> {
            if(ar.succeeded()){
                msg.reply(ar.result());
            }else{
                msg.reply(ar.cause().getMessage());
            }
         });
    };
}

private Future<String> getSomeData(String inputJson) {
    Promise<String> promise = Promise.promise();
    promise.complete("Returning Data");
    return promise.future();    
 }

}

【问题讨论】:

    标签: junit vert.x junit5 vertx-verticle


    【解决方案1】:

    我推荐使用 vertx-unit 项目,它可以很容易地测试异步代码。对于您的特殊情况,它会是这样的:

    import io.vertx.core.Vertx;
    import io.vertx.ext.unit.Async;
    import io.vertx.ext.unit.TestContext;
    import io.vertx.ext.unit.junit.VertxUnitRunner;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    
    @RunWith(VertxUnitRunner.class)
    public class MainVerticleTest {
    
      private Vertx vertx;
    
      @Before
      public void setup(TestContext ctx){
        Async async = ctx.async();
        this.vertx = Vertx.vertx();
        vertx.deployVerticle(MyVerticle.class.getName(), h -> {
          if(h.succeeded()){
            async.complete();
          }else{
            ctx.fail();
          }
        });
      }
    
      @Test
      public void test_consumption(TestContext ctx) {
        Async async = ctx.async();
        vertx.eventBus().request("address.xyz","message", h ->{
          if(h.succeeded()){
            ctx.assertEquals("Returning Data",h.result().body().toString());
            async.complete();
          }else{
            ctx.fail(h.cause());
          }
        });
      }
    }
    
    

    【讨论】:

    • 非常感谢!这很完美。只是其中的一个小更新。 ctx.assertEquals("返回数据",h.result().body().toString());再次感谢!
    • 在同一个测试用例代码中,您将如何在 Verticle 中创建 Autowired 组件的模拟实例?我正在尝试一个但没有得到这种自动装配组件的模拟实例。总是为空。在非 vert.x 代码中,它可以完美运行。为方便起见,我为它创建了单独的问题。也感谢您对这个问题的帮助。你可以在stackoverflow.com/questions/59258029/…找到它
    猜你喜欢
    • 2019-05-28
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多