【问题标题】:Awaitility in javajava中的等待
【发布时间】:2018-07-19 08:50:19
【问题描述】:

我正在尝试使用 Java 中的 Awaitility 包为我的集成测试编写一个场景。

我有一个电话如下:

System.out.println(...)
await().atMost(10,Duration.SECONDS).until(myFunction());
and some code here....

在这里,它会等待 10 秒,直到调用 myFunction()。

我想要这样的东西,我的要求是: 它应该每秒调用 myFunction() 持续 10 秒。有没有更好的方法呢?

【问题讨论】:

    标签: awaitility


    【解决方案1】:

    等待的默认轮询间隔为 100 毫秒(即 0.1 秒)。它是 wiki 中的 documented under Polling

    如果要将轮询间隔设置为一秒,则将其添加到等待中:

    with().pollInterval(Duration.ONE_SECOND).await().atMost(Duration.TEN_SECONDS).until(myFunction());
    

    这应该每秒完成一次轮询,最长持续 10 秒。

    这是一个非常简单的例子:

    import static org.awaitility.Awaitility.*;
    import org.awaitility.Duration;
    import java.util.concurrent.Callable;
    
    public class Test {
    
        private Callable<Boolean> waitmeme(int timeout) {
            return new Callable<Boolean>() {
                int counter = 0;
                int limit = timeout;
                public Boolean call() throws Exception {
                    System.out.println("Hello");
                    counter++;
                    return (counter == limit);
                }
            };
        }
    
        public void runit(int timeout) {
            try {
                with().pollInterval(Duration.ONE_SECOND)
                      .await()
                      .atMost(Duration.TEN_SECONDS)
                      .until(waitmeme(timeout));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String args[]) throws Exception {
            int timeout = 11;
            if (args.length >= 1)
                timeout = Integer.parseInt(args[0]);
            new Test().runit(timeout);
        }
    }
    

    【讨论】:

    • 使用 Poll,它是否每 1 秒调用一次 myFunction()?一旦 myFunction() 返回 true,它会停止轮询吗?
    • 是的,它会每隔 1 秒调用一次,只要它返回 false。一旦返回 true,它将退出,如果没有,则在超时后它会抛出 ConditionTimeoutException。我将添加一个简短的示例代码。
    • 如果 myFunction 有像 myFunction(x,y) 这样的参数会发生什么。它会起作用吗?
    • 从代码中可以看出,原来的函数返回一个Callable。将参数传递给 Callable 由您决定(您可以看到我是如何传递超时的),然后在可调用对象中处理它。 Calllable 需要返回 true 或 false,但在它内部可以使用用于创建 Callable 的参数做任何你需要的事情
    • 这意味着在放置 with().pollInterval(Duration.ONE_SECOND) 之前。它每 0.1 秒调用一次 myFunction(),直到超时或条件返回 true。不像等10秒再调用函数吧?
    【解决方案2】:

    它应该每秒调用 myFunction() 持续 10 秒

    为什么不直接使用 Thread.sleep() 呢?

    for(int i=1;10>=i;i++){
       myFunction();
       try{
          Thread.sleep(1000);
       }catch(InterruptedException e){
          System.out.println('Thread was interrupted!');
       }
    }
    

    【讨论】:

    • 我们可能会在 1 秒内什么都不做。所以,sleep() 是不可取的。
    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多