我依靠某些第三方API来执行某些操作,例如删除用户。 user.delete()
。不幸的是,这是无效的回报,并没有给我像CompletableFuture
这样的回报。
这在集成测试中给我带来了一些问题,因为我希望在多个测试中创建一个用户,然后在测试准备好进行下一个测试时将其删除。如果第三方尚未完成删除任务,则测试不会运行。
所以我可以在测试代码中想到两个解决方案
Thread.sleep(1000);
运气非常脆弱,我不知道要花多长时间。或阻塞直到我确定用户不再存在(当用户不存在时抛出ResourceException)
private void blockUntilUserRemoved() {
try {
do {
servicesClient.getUser("donald.duck@disney.com");
} while (true);
} catch (ResourceException e) {
return;
}
}
这可以工作,但是使用异常控制这样的逻辑会感到不对。问题在测试代码中有关系吗?
答案 0 :(得分:2)
这与使用void
返回类型所做的一样多。因此,基本上,您在此处进行了长池处理,并检查它是否已真正删除。
我可以想到的其他事情可能是 一个可以删除的数据库触发器-不知道是否有可能。但即使是-对于测试,这也需要大量的工作。另一件事是,您可以在一个单独的线程中执行此操作,并且只要结果到来,您的主线程就会更新-但是,对我而言,对于测试而言,这听起来像是一个过大的杀伤力。
另一个小建议是Thread.onSpinWait
(自Java-9起)-请阅读文档,以了解它可能有多大帮助。