我依赖一些第三方 API 来执行某些操作,即删除用户,例如。 user.delete()
。不幸的是,这是一个无效的返回,并且没有给我任何类似 CompletableFuture
返回的东西。
这给我的集成测试带来了一些问题,因为我希望在多个测试中创建一个用户,然后在测试完成准备下一个测试后将其删除。如果第三方未完成删除任务,则测试不会运行。
所以我可以在我的测试代码中想到两种解决方案
Thread.sleep(1000);
恶心很脆弱,我不知道需要多长时间。或者阻塞直到我可以确定用户不再存在(当用户不存在时抛出ResourceException)
private void blockUntilUserRemoved() {
try {
do {
servicesClient.getUser("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5e3a31303f323a703a2b3d351e3a372d303b27703d3133" rel="noreferrer noopener nofollow">[email protected]</a>");
} while (true);
} catch (ResourceException e) {
return;
}
}
这可以工作,但使用异常来控制这样的逻辑感觉不对。问题是它在测试代码中重要吗?
最佳答案
这就是您可以使用 void
返回类型完成的操作。所以基本上你在这里做一个长池并检查它是否真的被删除了。
我能想到的其他事情是可能一个可以在删除上工作的数据库触发器 - 但不知道是否可能;但即使是这样 - 对于测试来说,这也需要大量的工作。另一件事是,也许你可以在一个单独的线程中执行此操作,并且只要结果出现,你的主线程就会更新 - 但同样,对于测试来说,这对我来说听起来像是一种矫枉过正。
另一个小建议是 Thread.onSpinWait
(自 java-9 起) - 阅读它的文档以了解它有何帮助(一点)。
关于JUnit 在继续之前等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51650123/