当前位置: 首页 > 知识库问答 >
问题:

vert.x单元测试不使用future实现start方法的Verticle

牟星火
2023-03-14
public class HelloVerticle extends AbstractVerticle {

  @Override
  public void start() throws Exception {

    String greetingName = config().getString("greetingName", "Welt");
    String greetingNameEnv = System.getenv("GREETING_NAME");
    String greetingNameProp = System.getProperty("greetingName");

    Router router = Router.router(vertx);
    router.get("/hska").handler(routingContext -> {
        routingContext.response().end(String.format("Hallo %s!", greetingName));
    });
    router.get().handler(routingContext -> {
        routingContext.response().end("Hallo Welt");
    });

    vertx
            .createHttpServer()
            .requestHandler(router::accept)
            .listen(8080);
  }
}

我想对这个verticle进行单元测试,但我不知道如何等待verticle被部署。

@Before
public void setup(TestContext context) throws InterruptedException {
    vertx = Vertx.vertx();
    JsonObject config = new JsonObject().put("greetingName", "Unit Test");

    vertx.deployVerticle(HelloVerticle.class.getName(), new DeploymentOptions().setConfig(config));
}

当我像这样设置测试时,我必须在deploy调用之后添加线程.sleep,以便在对verticle进行一段时间的填充后执行测试。

我听说了等待,应该可以等待verticle与这个库一起部署。但是我没有找到关于如何将等待性与vertx-unit和deployverticle方法一起使用的任何示例。

或者在测试中调用deployverticle-method后,我真的必须硬编码睡眠计时器吗?

看一看公认答案的注释

共有1个答案

暨修洁
2023-03-14

首先,您需要实现start(Future Future),而不仅仅是start()。然后,您需要向Listen(...)调用添加回调处理程序(处理程序 >ListenHandler httpserver>)-该调用然后解析通过Start(Future Future)获得的Future

vert.x是高度异步的--vert.x HTTP服务器的开始也是如此。在您的示例中,当HTTP服务器成功启动时,Verticle将完全起作用。因此,您需要实现我上面提到的东西。

其次,您需要告诉TestContextVerticle的异步部署已经完成。这可以通过另一个回调处理程序完成(处理程序 >CompletionHandler )。下面的博客文章展示了如何做到这一点。Verticle的部署始终是异步的,即使您实现了普通的start()方法。因此,如果您希望确保Verticle在测试前已成功部署,则应始终使用CompletionHandler

所以,不,您不需要也绝对不应该在任何Vert.x应用程序中硬编码睡眠计时器。注意金科玉律--不要阻塞事件循环。

编辑:

如果Verticle的初始化是同步的,那么应该覆盖普通的start()方法-就像文档中提到的那样:

 类似资料:
  • 我有一个触发器,当opportunity更新时触发,作为其中的一部分,我需要调用我们的API,并提供opportunity的一些详细信息。 根据Web上的许多建议,我创建了一个类,其中包含一个@Future方法来制作标注。 我试图捕获在@future方法中抛出的异常,但测试方法没有看到它。 测试中的类如下所示: 下面是单元测试: 现在,我已经读到,测试@future方法的方法是用测试来围绕调用。s

  • 本文向大家介绍使用Go进行单元测试的实现,包括了使用Go进行单元测试的实现的使用技巧和注意事项,需要的朋友参考一下 简介 日常开发中, 测试是不能缺少的. Go 标准库中有一个叫做 testing 的测试框架, 可以用于单元测试和性能测试. 它是和命令 go test 集成使用的. 测试文件是以后缀 _test.go 命名的, 通常和被测试的文件放在同一个包中. 单元测试 单元测试的格式形如: 在

  • 我正在将Grails2中的一系列单元测试升级到Grails3,并且在使用GORM动态方法的域测试中遇到了问题--特别是addTo{myHasMany}方法。 给定以下域对象 > 我尝试使用DomainClassUnitTestMixin和mockDomain()方法模拟Contact实例,以生成带有GORM方法(或子集)的实例。 我已经尝试了使用基于Spock交互的测试支持的方法。 事实上,我已经

  • 问题内容: 我有以前具有大量方法的类,因此我将此方法的工作细分为“辅助”方法。 这些辅助方法声明为强制执行封装- 但是我想对大型公共方法进行单元测试。是否也可以对辅助方法进行单元测试,好象其中的一个失败,而调用它的公共方法也会失败,这样我们就可以确定为什么失败了? 另外,为了使用模拟对象测试这些对象,我需要将其可见性从私有更改为受保护,这是否可取? 问题答案: 一种方法是省略测试并将其放在同一程序

  • 测试失败,因为为。为什么不以阻塞的方式在ViewModel中运行块? 我知道,如果将其转换为返回对象的方法,则可以通过调用获取对象,或者可以返回并调用。但是,我想通过将我的ViewModel方法保留为函数来实现这一点,有没有办法做到这一点呢?

  • 我在单元测试中使用了Moq框架。这是UpdateApplication测试方法: 我在运行测试时遇到一个异常: 我应该如何编写使用Moq更新和删除操作的单元测试?