Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何等待api请求返回响应?_Java_Rest - Fatal编程技术网

Java 如何等待api请求返回响应?

Java 如何等待api请求返回响应?,java,rest,Java,Rest,我们使用基于rest-assured库&Testng的专有框架来自动化rest-web服务的API测试。我看到一些api测试代码,它使用Thread.sleep(n秒)等待返回响应。这对我来说似乎是错误的,因为响应时间可能会有所不同。我认为应该有一种更好的等待回应的方式,即只等待必要的回应。也许我可以每隔几毫秒进行一次轮询,或者使用观察者(test)-观察者(api)设计模式,或者其他什么。我不确定 如何等待api返回响应 这是代码的样子: @Test public void doApiTest

我们使用基于rest-assured库&Testng的专有框架来自动化rest-web服务的API测试。我看到一些api测试代码,它使用
Thread.sleep(n秒)
等待返回响应。这对我来说似乎是错误的,因为响应时间可能会有所不同。我认为应该有一种更好的等待回应的方式,即只等待必要的回应。也许我可以每隔几毫秒进行一次轮询,或者使用观察者(test)-观察者(api)设计模式,或者其他什么。我不确定

如何等待api返回响应

这是代码的样子:

@Test
public void doApiTesting() throws Exception 
{   
    framework.loginUser(User);
    framework.createNewData();//Takes some time.
    Thread.sleep(10000);
}
  • 如果您可以重构
    createNewData()
    ,您应该:在完成数据创建过程之前不要返回。该名称并不表示调用仅仅是为了启动数据创建过程,因此某些使用API的程序员可能会花费大量时间调试由假定数据在调用后立即出现的代码引起的问题

  • 如果你必须回来,你至少可以给它起个更好的名字。类似于
    startNewDataCreation(callback)
    ,其中
    callback
    将是您所指的观察者

  • 如果您根本无法更改实现,那么更好的替代方法可能是检查是否定期创建数据。这至少可以保证正确性<代码>线程睡眠(10000)似乎是一种可能在不利条件下失败的黑客


使用支持异步测试的测试框架,如(可与java一起使用)或阻止调用

例如,如果调用遵循
CompletionStage
接口,则可以:

@Test
public void doApiTesting() throws Exception
{
    framework.loginUser(User);
    framework.createNewData()
        .toCompletableFuture().get();
}

顺便说一句,我希望您在单元测试中没有对API或数据库进行外部调用。如果是,则它们不是单元测试;)

谢谢。很可能无法更改实现。在这种情况下,可以继续使用Thread.sleep或使用/创建一些代码每隔几秒钟检查一次数据的创建情况吗?我认为最好是检查数据是否创建,因为我们不会让任何事情发生,并且保证会得到纠正。我不知道这方面的快捷方式。您可以尝试将类型为
CompletionStage
的变量分配给该表达式,并查看它是否有问题。如果它没有实现
CompletionStage
,并且没有收到回调,那么为什么需要等待?它必须是同步的,或者返回可以等待的东西
@Test
public void doApiTesting() throws Exception
{
    framework.loginUser(User);
    framework.createNewData()
        .toCompletableFuture().get();
}