【问题标题】:Thread.sleep Bad Idea for Spring Integration Tests?Thread.sleep Spring 集成测试的坏主意?
【发布时间】:2016-12-20 17:50:27
【问题描述】:

在测试实体更新时,我还想确保日期工作正常。在我的实体中,我有:

@PreUpdate
private void onUpdate() {
    this.lastUpdated = new LocalDateTime();
}

当我测试更新的品牌时,我创建了品牌,修改它,然后调用更新,之后我重新获取品牌以断言我可以通过更改的值找到它。

保存和更新之间的时间通常很短,最终日期相同:

assertThat(first.getLastUpdated().isBefore(brand.get().getLastUpdated())).isEqualTo(true);

我目前通过在保存和更新之间添加Thread.sleep(100) 调用解决了这个问题,但我的直觉认为这是一个非常糟糕的主意。想法?

【问题讨论】:

  • 我会看看这个,并重组我的代码,正如接受的答案所暗示的那样。 stackoverflow.com/questions/11887799/… 其次,你应该能够假设@PreUpdate 正在按预期工作,如果你想确保你的方法被注释,做一个小单元测试来验证这一点。如果它支持,您也可以让数据库处理 on update(我实际上更喜欢这个)

标签: spring spring-boot integration-testing


【解决方案1】:

总的来说,我认为是的,这是个坏主意。

测试(当然包括集成测试)必须尽可能快。如果你有一个下降的代码库和下降量的集成测试,许多这样的睡眠可能会花费几分钟甚至几个小时。如果您正在运行持续集成,这可能是一个重大问题,因为您需要快速构建。

当涉及到日期时,最好使用一些可以运行的模拟,而不是代码中的真实代码。这真的取决于你如何使用 Dates 来提供一个很好的例子。通常它需要在这些特定区域重构您的代码。

好消息是,通常大多数这样的代码都可能被单元测试覆盖,因此您不需要复杂的设置。可能您的集成测试要少得多,一个组件可能只有一两个。

【讨论】:

  • 谢谢,这与 Martin 的 cmets 一起很有帮助。
【解决方案2】:

如果您使用的是 Java 8,则注入 Clock 协作者会更干净,您可以控制它来进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多