【问题标题】:vert.x testing with TestNg使用 TestNg 进行 vert.x 测试
【发布时间】:2020-02-18 10:56:54
【问题描述】:

我是 vert.x 的新手,我正在尝试通过调用我的 webservices 来进行单元测试。 我需要一个用 testng 测试 web 服务的例子。

当我使用 junit5 进行操作时,它可以在下面的代码中正常工作

@BeforeMethod
private static void deploy_verticle(Vertx vertx , VertxTestContext testContext) {
    vertx.deployVerticle(new MainVerticle(), testContext.completing());
}


@Test
public void getTestFalse(Vertx vertx , VertxTestContext testContext) throws InterruptedException {
    Assert.assertTrue("3".contains("tesdfsdf"));

    req = new HttpRequestEntityTest();
    req.setHost("localhost");
    req.setPort(8089);
    req.setUri("/api/data");
    utilTest = new RestUtilTest();
    response = new HttpResponseEntityTest();
    utilTest.getTestUtil(req, testContext.succeeding(response -> {
        testContext.verify(() -> {
            Assert.assertTrue(response.getBodyStr().contains("tesdfsdf"));

        });
        testContext.completeNow();

    }));
}


@AfterMethod
public void finish(Vertx vertx , VertxTestContext testContext) {

context.getVertx().close(context.getTestContext().succeeding(response -> {
    context.getTestContext().completeNow();
}));
}

但是当我尝试像这样使用 TestNg 时:

@SuppressWarnings("deprecation")
    @Test
    public void getTestIqvia() throws InterruptedException {
        Future<HttpResponseEntityTest> future = Future.future();
        response = new HttpResponseEntityTest();
        req = new HttpRequestEntityTest();
        req.setHost("localhost");
        req.setPort(8089);
        req.setUri("/api/data");
        utilTest = new RestUtilTest();

        utilTest.getTestUtil(req, response -> {
            System.out.println(response.result().getBodyStr());

            System.out.println(response.result().getBodyStr().contains("dsds"));
            Assert.assertTrue(response.result().getBodyStr().contains("fdsfds"));

        });

GetTestUtil 函数:

public Future<HttpResponseEntityTest> getTestUtil(HttpRequestEntityTest req,
        Handler<AsyncResult<HttpResponseEntityTest>> resultHandler) {
    future = Future.future();

    WebClient client = WebClient.create(vertx);
    response = new HttpResponseEntityTest();
    client.get(req.getPort(), req.getHost(), req.getUri()).send(ar -> {
        if (ar.succeeded()) {

            response.setStatusCode(ar.result().statusCode());
            response.setBodyStr(ar.result().bodyAsString());
            future.complete(response);
            System.out.println("Received response with status code get" + response.getStatusCode());
            resultHandler.handle(Future.succeededFuture(response));

        } else {
            response.setErrorMsg(ar.cause().getMessage());
            System.out.println("Something went wrong " + ar.cause().getMessage());
            future.complete(response);

        }

    });

    return future;

} 

始终发送到未在箭头函数 ar 中输入的 Web 客户端,并且始终测试成功,因为它不会转到 Assert 函数。除了在调试模式下几次

任何人都可以用 Vert.x 在 testNG 中举个例子吗?或者我的代码有什么问题?

【问题讨论】:

    标签: java testng webclient vert.x junit5


    【解决方案1】:

    这是因为 getTestIqvia 在调用 WebClient 回调之前完成。

    对于 jUnit5,相应的 Vert.x 测试扩展确保在所有异步断言都通过之前,测试不会被标记为通过。

    使用 TestNG,您需要手动执行此操作。在实践中,你需要让测试等到getTestUtil返回的future完成。

    【讨论】:

    • 你能给我一个这样做的例子吗?我试图将 awaitResult 设为:“awaitResult(h ->client.get(req.getPort(), req.getHost(), req.getUri()).send(ar -> { ”并在测试类中为这个“ vertx.eventBus().consumer("read", Sync.fiberHandler(m -> m.reply(utilTest.getTestUtil(req)))); " ,,,,, 我把@Suspendable 放在测试函数中
    • 它给了我这个异常>>>>>> QUASAR WARNING: Assertions enabled。这可能会损害性能。 QUASAR 警告:Quasar Java 代理未运行。如果您使用另一种检测方法,则可以忽略此消息;否则,请参阅 Quasar 文档中的入门部分。失败:getTestIqvia java.lang.IllegalStateException:不在 io.vertx.ext.sync.Sync.getContextScheduler(Sync.java:124) 的上下文中
    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 2011-07-26
    • 1970-01-01
    • 2022-01-23
    • 2020-05-21
    • 2021-10-22
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多