vertx的学习总结6之动态代理类和测试

Beyond the event bus

一、章节覆盖:

如何在事件总线之上公开服务
verticles和事件总线服务的异步测试

动态代理:

MyService 接口

package porxy.test;


import io.vertx.codegen.annotations.ProxyGen;

@ProxyGen
public interface MyService {

    void hello(String name);

}
MyServiceImpl类
package porxy.test;

public class MyServiceImpl implements MyService {

    @Override
    public void hello(String name) {
        System.out.println("Hello, " + name + "!");
    }

}

Main类

package porxy.test;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
import io.vertx.serviceproxy.ProxyHelper;

public class MainVerticle extends AbstractVerticle {

    @Override
    public void start() {
        ProxyHelper.registerService(MyService.class, vertx, new MyServiceImpl(), "my-service");

        MyService service = ProxyHelper.createProxy(MyService.class, vertx, "my-service");

        service.hello("World");
    }

    public static void main(String[] args) {
        Vertx vertx1 = Vertx.vertx();
        vertx1.deployVerticle(new MainVerticle());
    }
}

看到这里,你们肯定一脸懵逼,如何在事件总线之上公开服务关动态代理什么事?其实是这样的,

@ProxyGen是Vert.x框架中用于生成代理类的工具。它可以根据接口定义生成对应的代理类,代理类可以用于在不同的Vert.x组件之间进行通信。(就是eventbus)

这些生成的代理类主要用于Vert.x的分布式事件总线。分布式事件总线是一种机制,它允许在Vert.x集群中的不同节点之间进行消息传递和事件发布/订阅。使用@ProxyGen生成的代理类可以将接口方法调用转化为事件总线消息发送,并且将返回结果反馈给调用方。

具体来说,当使用@ProxyGen注解修饰一个接口时,会生成一个代理类,该代理类实现了被注解的接口,并且可以通过事件总线进行远程调用。生成的代理类内部会将接口方法调用封装为消息对象,然后通过事件总线将消息发送给服务提供方,服务提供方收到消息后会执行相应的逻辑,并将结果返回给调用方。

生成的代理类使得远程通信变得更加简单和透明,开发者无需关心底层的通信细节,只需要像调用本地方法一样调用生成的代理类即可。

二、异步测试

1. 引入依赖

各个注解的解释

  1. @ExtendWith(VertxExtension.class) 注解告诉 JUnit 使用 VertxExtension 来运行测试。VertxExtension 内部会创建一个 Vert.x 实例,并在测试之前和之后进行启动和关闭操作。它还提供了一些用于执行异步操作和处理 Vert.x 上下文的工具方法。

  2. @BeforeEach 注解表示在每个测试方法之前运行该方法。在测试方法运行之前,会先执行被 @BeforeEach 注解修饰的方法。这里可以进行一些准备工作,例如创建测试数据、初始化对象等。

  3. @Test 注解表示该方法是一个测试方法。JUnit 会执行被 @Test 注解修饰的方法,并验证其行为是否符合预期。可以在这里编写各种测试逻辑和断言  

package Test;

import io.vertx.core.Vertx;
import io.vertx.junit5.VertxExtension;
import io.vertx.junit5.VertxTestContext;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(VertxExtension.class)
public class VertxTest {

    private Vertx vertx;

    @BeforeEach
    void setup() {
        vertx = Vertx.vertx(); // 初始化 Vert.x 实例
    }

    @Test
    void testSomething(VertxTestContext testContext) throws InterruptedException {
        // 在这里编写你的测试逻辑
        vertx.setTimer(1000,event -> {
            System.out.println("hello");
        });
        Thread.sleep(2000);
        // 使用 testContext 来进行异步测试,并处理测试结果
        testContext.completeNow(); // 示例:完成测试
    }
}

posted @ 2023-10-04 23:17  过移  阅读(31)  评论(0编辑  收藏  举报  来源