Vertx之Junit单元测试

介绍

Vertx-junit5该模块为使用 JUnit 5 编写 Vert.x 测试提供集成和支持

1. maven项目依赖

<dependencies>
	<dependency>
		<groupId>io.vertx</groupId>
		<artifactId>vertx-web</artifactId>
	</dependency>
	<dependency>
		<groupId>io.vertx</groupId>
		<artifactId>vertx-config-yaml</artifactId>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
	</dependency>
	<dependency>
		<groupId>com.lance.common</groupId>
		<artifactId>vertx-common-core</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
	 <!-- Test -->
	<dependency>
		<groupId>io.vertx</groupId>
		<artifactId>vertx-junit5</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

2.YAML文件配置

server:
  port: 18002

3.启动加载配置文件, 并放入到config中去

public class UnitApplication {

  public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();
    ConfigRetriever retriever = readYaml(vertx);

    retriever.getConfig(json -> {
      DeploymentOptions options = new DeploymentOptions().setConfig(json.result());
      vertx.deployVerticle(MainApp.class.getName(), options);
    });
  }

  private static ConfigRetriever readYaml(Vertx vertx) {
    ConfigStoreOptions store = new ConfigStoreOptions()
        .setType("file")
        .setFormat("yaml")
        .setOptional(true)
        .setConfig(new JsonObject().put("path", "application.yaml"));

    return ConfigRetriever.create(vertx, new ConfigRetrieverOptions().addStore(store));
  }
}

4.Vertx http client单元测试

Slf4j
@ExtendWith(VertxExtension.class)
class WebRequestTests {
  private final Vertx vertx = Vertx.vertx();

  /**
   * test vertx server
   */
  @Test
  @Disabled
  void suite() {
    vertx.createHttpServer()
        .requestHandler(req -> req.response().end("Ok"))
        .listen(16969, ar -> {
          log.info("===> vertx start: {}", ar.succeeded());
        });
  }

  /**
   * 1.允许等待其他线程中的操作以通知完成, 类似java中promise对象
   * 2.支持接收断言失败以将测试标记为失败
   */
  @Test
  @Disabled
  void asyncContext() throws Throwable {
    VertxTestContext testContext = new VertxTestContext();

    vertx.createHttpServer()
        .requestHandler(req -> req.response().end())
        .listen(16969)
        .onComplete(testContext.succeedingThenComplete());
    //.onComplete(testContext.failingThenComplete());

    Assertions.assertTrue(testContext.awaitCompletion(5, TimeUnit.SECONDS));
    if (testContext.failed()) {
      throw testContext.causeOfFailure();
    }
  }

  /**
   * Test http client
   */
  @Test
  @Disabled
  void httpClient() throws Exception {
    HttpClient client = vertx.createHttpClient();
    VertxTestContext testContext = new VertxTestContext();

    client.request(HttpMethod.GET, 18002, "127.0.0.1", "/user/info/2")
        .compose(req -> req.send().compose(HttpClientResponse::body))
        .onComplete(testContext.succeeding(buffer -> testContext.verify(() -> {
          JsonObject jsonObject = buffer.toJsonObject();
          log.info("===>Response body: {}", jsonObject);
          Assertions.assertEquals(jsonObject.getString("code"), HttpResponseStatus.OK.reasonPhrase());
          testContext.completeNow();
        }))).onFailure(event -> log.error("===>fail: ", event.getCause()));

    boolean awaitResult = testContext.awaitCompletion(30, TimeUnit.SECONDS);
    log.info("===>Await: {}", awaitResult);
  }

  /**
   * 只需调用即可将许多测试标记为通过completeNow在执行的某个时间点。话虽如此,在许多情况下,测试的成功取决于要验证的不同异步部分。
   */
  @Test
  @Disabled
  void checkpoint() {
    int port = 9001;
    VertxTestContext testContext = new VertxTestContext();
    Checkpoint serverStarted = testContext.checkpoint();
    Checkpoint requestsServed = testContext.checkpoint(10);
    Checkpoint responsesReceived = testContext.checkpoint(10);

    vertx.createHttpServer()
        .requestHandler(req -> {
          req.response().end("success");
          requestsServed.flag();
        })
        .listen(port)
        .onComplete(testContext.succeeding(httpServer -> {
              serverStarted.flag();

              HttpClient client = vertx.createHttpClient();
              for (int i = 0; i < 10; i++) {
                client.request(HttpMethod.GET, port, "localhost", "/")
                    .compose(req -> req.send().compose(HttpClientResponse::body))
                    .onComplete(testContext.succeeding(buffer -> testContext.verify(() -> {
                          Assertions.assertEquals("success", buffer.toString());
                          responsesReceived.flag();
                        }))
                    );
              }
            })
        );
  }
}

5.Vertx test context单元测试

@Slf4j
@ExtendWith(VertxExtension.class)
class VertxExtensionTests {
  private final int port = 9000;

  @BeforeEach
  void init(Vertx vertx, VertxTestContext testContext) {
    vertx.deployVerticle(new HttpServerVertical(), testContext.succeedingThenComplete());
  }

  @AfterEach
  public void after(Vertx vertx) {
    log.info("===>Vertx close.");
    vertx.close();
  }

  /**
   * 连续测试3次
   * repetition 1 of 3
   * repetition 2 of 3
   * repetition 3 of 3
   */
  @Disabled
  @RepeatedTest(3)
  void request3Times(Vertx vertx, VertxTestContext testContext) {
    HttpClient client = vertx.createHttpClient();
    client.request(HttpMethod.GET, port, "localhost", "/")
        .compose(req -> req.send().compose(HttpClientResponse::body))
        .onComplete(testContext.succeeding(buffer -> testContext.verify(() -> {
          log.info("===>Response result: {}", buffer.toString());
          testContext.completeNow();
        })));
  }

  @Test
  @Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
  void timeout(Vertx vertx, VertxTestContext testContext) {
    HttpClient client = vertx.createHttpClient();
    client.request(HttpMethod.GET, port, "localhost", "/")
        .compose(req -> req.send().compose(HttpClientResponse::body))
        .onComplete(testContext.succeeding(buffer -> testContext.verify(() -> {
          Thread.sleep(5000L);
          log.info("===>Response timeout result: {}", buffer.toString());
          testContext.completeNow();
        })));
  }

  /**
   * 单服务测试
   */
  @Test
  @Disabled
  void httpServerResponse(Vertx vertx, VertxTestContext testContext) {
    vertx.deployVerticle(new HttpServerVertical(), testContext.succeeding(id -> {

      HttpClient client = vertx.createHttpClient();
      client.request(HttpMethod.GET, port, "localhost", "/")
          .compose(req -> req.send().compose(HttpClientResponse::body))
          .onComplete(testContext.succeeding(buffer -> testContext.verify(() -> {
            log.info("===>Response result: {}", buffer.toString());
            Assertions.assertEquals(buffer.toString(), "success");
            testContext.completeNow();
          })));
    }));
  }

  class HttpServerVertical extends AbstractVerticle {
    @Override
    public void start() throws Exception {
      vertx.createHttpServer()
          .requestHandler(req -> {
            req.response().end("success");
          })
          .listen(port).onComplete(event -> {
            if (event.succeeded()) {
              log.info("===>Start [{}] success!", port);
              return;
            }

            log.error("===>Start fail: ", event.cause());
          });
    }
  }
}

6.项目完整地址

Vertx之Junit单元测试 Github 地址

Vertx之Junit单元测试 Gitee 地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vertx是一种基于事件驱动的应用程序框架,而MyBatis是一种流行的Java持久层框架。Vertx是轻量级的,可扩展的,适用于构建高性能的网络应用程序,而MyBatis则提供了一种优雅的方法来管理应用程序与数据库之间的交互。 Vertx与MyBatis的结合可以在构建Web应用程序时提供更好的开发体验和性能。Vertx通过异步IO和事件驱动的方式,可以快速地处理来自Web客户端的请求。而MyBatis可以通过提供有针对性的SQL语句,方便地对数据库进行操作。 Vertx提供了一个轻量级的Web服务器,可以处理HTTP请求和Websocket连接。而MyBatis可以方便地将数据库查询结果映射为Java对象。通过使用Vertx和MyBatis,我们可以将数据库查询和处理请求的逻辑解耦,使代码更易于理解和维护。 使用Vertx和MyBatis的组合,我们可以轻松地构建可扩展的,高性能的Web应用程序。我们可以使用Vertx的事件总线机制来处理不同组件之间的消息传递,同时利用MyBatis的缓存机制提高数据库查询的性能。 总的来说,Vertx和MyBatis是一对强大的组合,可以帮助我们构建高性能、可扩展的Web应用程序。通过将异步事件驱动的编程模型与优雅的数据库交互方式结合起来,我们可以更轻松地开发复杂的应用程序。 ### 回答2: Vert.x是一个基于JVM的高性能、非阻塞、事件驱动的应用框架,它可以用于构建轻量级、可伸缩、可扩展的分布式系统。而MyBatis是一个流行的Java持久化框架,它能够帮助我们方便地进行数据库访问。 Vert.x和MyBatis可以结合使用,以实现高效的数据库访问和处理。通常情况下,我们可以使用Vert.x的事件驱动机制来处理Web请求,而MyBatis则用于执行数据库操作。 首先,我们可以使用Vert.x的路由器来处理HTTP请求,并在请求处理程序中调用MyBatis执行数据库查询或更新操作。通过这种方式,我们可以确保数据库的访问是非阻塞的,避免了阻塞其他请求的情况发生。 其次,Vert.x的事件总线机制可以用于将不同模块之间的消息进行传递和处理。我们可以在MyBatis的映射器接口中定义观察者,当数据库发生变化时,MyBatis会向事件总线发布消息,其他模块可以根据需求来订阅这些消息进行相应的处理。 另外,Vert.x的异步特性与MyBatis的异步API结合使用,可以进一步提升应用程序的性能。我们可以使用Vert.x的异步回调机制来执行MyBatis的异步数据库操作,从而避免线程阻塞和资源浪费。 总而言之,Vert.x和MyBatis的结合使用可以为我们提供一个高性能、可伸缩的应用程序架构。通过将事件驱动的非阻塞处理与灵活的数据库访问相结合,我们可以构建出更好的分布式系统。 ### 回答3: Vertx是一个开源的、响应式的应用程序平台,可用于构建高性能、可伸缩的微服务和分布式系统。MyBatis是一个Java持久层框架,用于管理数据库访问,并且可以将数据库操作与应用程序逻辑分离。那么,Vertx和MyBatis可以结合使用吗? 答案是可以的。Vertx提供了异步的、非阻塞的I/O操作,而MyBatis则可以将I/O操作,例如数据库查询和更新,封装成简洁易用的API。Vertx和MyBatis的结合可以提供高效的数据库访问和管理,并且保持系统的响应性和可伸缩性。 在Vertx中使用MyBatis非常简单。首先,需要在Vertx应用程序的依赖中添加MyBatis的库。然后,可以通过MyBatis的配置文件来配置数据库连接和SQL映射。接下来,可以在Vertx的事件处理器中使用MyBatis的API来执行数据库操作。 在Vertx中使用MyBatis可以享受到Vertx的优势,例如事件驱动的架构和高性能的I/O操作。此外,Vertx还提供了丰富的异步编程模型和工具,可以方便地与MyBatis结合使用,例如使用Vertx的Future和Promise来处理异步的数据库操作结果。 总而言之,Vertx和MyBatis的结合可以提供高效的数据库访问和管理,并且保持系统的响应性和可伸缩性。这是一种强大的组合,可以用于构建高性能、可伸缩的微服务和分布式系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值