JUnit 在继续之前等待

标签 junit java-8

我依赖一些第三方 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/

相关文章:

java - GC(分配失败)VS OutOfMemoryError异常

java - 在 @After 之前运行 TestWatcher

java - 枚举 toString 上的 ClassCastException

java - 测试设置例程设计模式

java - 为json数据编写junit测试用例

java - Sonar : Replace this lambda with a method reference

junit - IntelliJ 运行单元测试时出错 : Could not find or load main class ${surefireArgLine}

Java:如何构造或模式化一个类,以便我们可以在运行时映射组合对象?

java-8 - 如何在纯 Java 8 中获取给定日历周的所有周日期列表?

Java - 返回指定泛型类型的列表