首页 > 解决方案 > JUnit 在继续之前等待

问题描述

我依靠一些第三方 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;
    }
}

这会起作用,但使用异常来控制这样的逻辑感觉不对。问题是在测试代码中是否重要?

标签: junitjava-8

解决方案


这与void返回类型一样多。所以基本上你在这里做一个长池并检查它是否真的被删除了。

我能想到的其他事情可能是一个可以在删除时起作用的数据库触发器——但不知道是否可能;但即使是这样 - 对于测试,这也需要大量的工作。另一件事是,您可以在单独的线程中执行此操作,并且只要结果出现,您的主线程就会更新 - 但同样,对于我来说,对于测试来说,这听起来有点矫枉过正。

另一个小建议是Thread.onSpinWait(从 java-9 开始) - 阅读它的文档以了解它如何帮助(有点)。


推荐阅读