如何在Vert.x中对Handler <RoutingContext>进行单元测试?

时间:2019-12-17 16:49:34

标签: java unit-testing junit vert.x

我有:

Router.router(vertx).route().handler(new Handler<RoutingContext>() {
    @Override
    public void handle(RoutingContext event) {
        HttpServerRequest request = event.request();
        Buffer body = event.getBody();
        HttpServerResponse response = event.response();
        // Some code to test
        response.setStatusCode(200);
        response.end();
    }
});

如何通过给出准备好的请求和正文以及检查响应来对它进行单元测试?

2 个答案:

答案 0 :(得分:0)

此处要测试的单元是Handler的实现。

因此将匿名类更改为(至少)一个(非privatestatic 内部类

class MyHandler implements Handler<RoutingContext> {
    @Override
    public void handle(RoutingContext event) {
        HttpServerRequest request = event.request();
        Buffer body = event.getBody();
        HttpServerResponse response = event.response();
        // Some code to test
        response.setStatusCode(200);
        response.end();
    }
};

Router.router(vertx).route()。handler(new MyHandler());

然后,您可以创建Handlre的实例,以测试{em}返回contextrequest的模拟结果,以测试 mock 中的通过。

response

答案 1 :(得分:0)

通常,测试这种端点更多是集成测试而不是单元测试。 无需嘲笑一切。模拟是为了测试某些外部服务,这些服务在您的测试环境中不可用。这是一个与vert.x进行集成测试的示例:

@ExtendWith(VertxExtension.class)
class IntegrationTest {
private static RequestSpecification requestSpecification;

  @BeforeAll
  static void prepareSpec() {
    requestSpecification = new RequestSpecBuilder()
      .addFilters(asList(new ResponseLoggingFilter(), new RequestLoggingFilter()))
      .setBaseUri("http://localhost:3002/")// Depends on your verticle config.
      .build();
  }

@BeforeEach
  void setup(Vertx vertx, VertxTestContext testContext) {

    vertx
        .deployVerticle(new MyVerticle(), 
                ar -> {
                    if(ar.succeeded()) {
                        testContext.completeNow();
                    } else {
                        testContext.failNow(ar.cause());
                    }
                }
        );
  }

@Test
  @DisplayName("Test message")
  void test() {
    JsonObject body = new JsonObject();//Fill it as you want

    given(requestSpecification)
      .contentType(ContentType.JSON)
      .body(body.encode())
      .post("/yourreqest")//Your resource path
      .then()
      .assertThat()
      .statusCode(200);//expected status
}