Thread.sleep Spring集成测试的坏主意?

时间:2016-12-20 17:50:28

标签: spring spring-boot integration-testing

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

如果您使用的是Java 8,那么注入一个Clock协作者会更加清晰,您可以控制它来进行测试。

答案 1 :(得分:0)

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

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

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

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