如何在Vert.x中为WebClient的postAbs方法编写Junit测试用例?

如何在Vert.x中为WebClient的postAbs方法编写Junit测试用例?,junit,vert.x,junit5,vertx-verticle,Junit,Vert.x,Junit5,Vertx Verticle,最近,我开发了几个垂直链接,需要从中进行外部API调用。为了优化代码,我将调用API的代码移到了一个公共帮助器类中。我还将Vertex实例从Verticle传递到Helper类。我现在正试图为Helper类编写Junit测试用例,它看起来像下面的工作代码 public class ServiceExecutionHelper{ public Promise<String> executeService(String requestURI, JsonObject input, Mul

最近,我开发了几个垂直链接,需要从中进行外部API调用。为了优化代码,我将调用API的代码移到了一个公共帮助器类中。我还将Vertex实例从Verticle传递到Helper类。我现在正试图为Helper类编写Junit测试用例,它看起来像下面的工作代码

public class ServiceExecutionHelper{

public Promise<String> executeService(String requestURI, JsonObject input, MultiMap headers, Vertx vertx){
        Promise<String> promise = Promise.promise();
        WebClient client = WebClient.create(vertx);
        client.postAbs(requestURI).timeout(60000).putHeaders(headers)
        .sendJsonObject(input, ar -> {
            if (ar.succeeded()) {
                HttpResponse<Buffer> response = ar.result();
                JsonObject serviceRespone = new JsonObject(response.bodyAsString());
                JsonArray responseData = serviceRespone.getJsonArray("response_data");
                if(responseData != null){
                    promise.complete("promise_completed");
                }else{
                    promise.fail("promise_failed");
                }
            }
        }
        return promise;
}
}
公共类ServiceExecutionHelper{
public Promise executeService(字符串请求URI、JsonObject输入、多映射头、Vertx Vertx){
允诺,允诺;
WebClient client=WebClient.create(vertx);
client.postAbs(requestURI).timeout(60000).putHeaders(headers)
.sendJsonObject(输入,ar->{
如果(ar.successed()){
HttpResponse response=ar.result();
JsonObject serviceRespone=新的JsonObject(response.bodyAsString());
JsonArray responseData=serviceRespone.getJsonArray(“响应数据”);
if(responseData!=null){
承诺。完成(“承诺完成”);
}否则{
承诺失败(“承诺失败”);
}
}
}
回报承诺;
}
}

任何人都可以指导我如何为上述代码编写测试用例吗?

根据您需要测试的具体内容,有一百万种方法可以做到这一点

这里有一个使用junit5和okhttp的建议,还有很多其他的替代方案

该测试验证:

  • 使用输入参数中包含的有效负载发送POST请求
  • 您的实现可以处理来自Web服务器的json响应
  • 您的实现只向Web服务器发送一个请求
  • 如果服务器的响应包含键
    “Promise\u completed”
@ExtendWith(VertxExtension.class)
@Slf4j
公共类ServiceExecutionHelperTest{
私人服务执行助手sut;
私有MockWebServer MockWebServer;
@之前
公共作废设置(){
sut=新的ServiceExecutionHelper();
mockWebServer=新建mockWebServer();
}
@试验
public void testExecuteService(final Vertx Vertx,final VertxTestContext testContext)抛出中断异常{
//给定
final JsonObject requestPayload=新JsonObject().put(“请求”,新JsonArray([]);
final JsonObject serverResponsePayload=new JsonObject().put(“response_data”,new JsonArray([]);
mockWebServer.enqueue(新的MockResponse()
.setBody(serverResponsePayload.encode())
.setResponseCode(200)
.setHeader(“内容类型”、“应用程序/json”);
//什么时候
最后的承诺=
sut.executeService(
mockWebServer.url(“/”).toString(),
请求有效载荷,
MultiMap.CaseInsensitiveEmultimap(),
vertx);
//然后
final RecordedRequest RecordedRequest=mockWebServer.takeRequest();
assertEquals(“POST”,recordedRequest.getMethod());
assertEquals(“[text={\'request\':[]}]”,recordedRequest.getBody().toString());
assertEquals(1,mockWebServer.getRequestCount());
testContext.assertComplete(stringPromise.future())
.map(val->{
资产质量(“承诺完成”,val);
testContext.completeNow();
返回val;
})
.onComplete(onComplete->{
assertTrue(onComplete.successed());
日志信息(“完成”);
})
.onFailure(onError->Assertions.fail());
}
}
从TDD的角度来看一些词

在开始编写测试之前(如果你问我的话,还有你的实际代码),你应该澄清你的功能和技术需求

这些应该是测试的基础,测试应该是实现代码的起点

因此,我不能向您保证,此示例是针对您的用例的正确测试。它可以编译并运行。但它应该根据您的实际需求进行验证和扩展

关于测试覆盖率的问题

为了让这个答案简洁明了,我没有编写涵盖所有可能分支的测试。服务器响应时没有
response\u数据
(即if子句的
else
分支,承诺失败)的情况没有测试

为了涵盖这种情况,需要进行第二次测试或使用参数化测试