在编写异步相关的测试用例时,不知道有没有同学粗暴地使用过Thread.sleep尝试地等待一个时长,然后去查询校验结果,本地运行断言全都通过,但到了CI环境中,确无法通过?所以又粗暴地增加了等待时长。
或者优雅一点使用过CountDownLatch,但使用这种方式往往会对异步执行逻辑产生侵入。所以我们可能想到:能否有一个循环判断逻辑外加一个最大等待时间。在限定的等待时间内,不断尝试获取校验异步逻辑的结果。
基于上述需求,很自然地写出如下功能函数:
public static boolean assertWait(int millis, Supplier supplier) {
Boolean flag = supplier.get();
long current = System.currentTimeMillis();
while (!flag && System.currentTimeMillis() - current < millis) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
flag = supplier.get();
}
}
return flag;
}
接下来我们看下上述代码存在哪些问题:
针对性解答,如下:
public static void assertWait2(long millis, Supplier supplier) {
boolean result = false;
long spin = Math.max(millis / 1000, 20);
Duration duration = Duration.ofMillis(millis);
long waitTime = 0;
do {
result = supplier != null && supplier.get();
if (result) {
break;
}
try {
synchronized (duration) {
duration.wait(spin);
}
waitTime += spin;
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (!result && waitTime < millis);//从IDE的提示看!result 一直为true等效于while (waitTime < millis);
return result;
}
public static void assertWait2(int timeout, TimeUnit unit, Supplier supplier){
long millis = unit.toMillis(timeout);
return assertWait2(millis,supplier);
}
| 留言与评论(共有 0 条评论) “” |