Thread.sleep Spring 集成测试的坏主意?
Thread.sleep Bad Idea for Spring Integration Tests?
在测试实体的更新时,我还想确保日期工作正常。在我的实体中,我有:
@PreUpdate
private void onUpdate() {
this.lastUpdated = new LocalDateTime();
}
当我测试一个正在更新的品牌时,我创建了品牌,修改它,然后调用更新,之后我重新获取品牌以断言我可以通过更改后的值找到它。
保存和更新之间的时间通常很短,最终日期相同:
assertThat(first.getLastUpdated().isBefore(brand.get().getLastUpdated())).isEqualTo(true);
我目前通过在保存和更新之间添加一个 Thread.sleep(100)
调用来解决这个问题,但我的直觉告诉我这是一个非常糟糕的主意。想法?
如果您使用的是 Java 8,注入一个 Clock 协作者会更干净,您可以控制它来进行测试。
总的来说,我认为是的,这是个坏主意。
测试(当然包括集成测试)必须尽可能快。如果您有下降代码库和下降数量的集成测试,那么像这样的睡眠可能会花费几分钟甚至几小时。如果您运行宁持续集成,这可能是一个重要问题,因为您需要快速构建。
当涉及到日期时,最好使用一些模拟 运行 而不是代码中的真实代码。这实际上取决于您如何准确地使用 Dates 来提供一个很好的例子。通常它需要在这些特定区域重构您的代码。
好消息是,通常像这样的大部分代码都可能完全被单元测试覆盖,因此您不需要复杂的设置。可能您的集成测试会少得多,一个组件可能只有一两个。
在测试实体的更新时,我还想确保日期工作正常。在我的实体中,我有:
@PreUpdate
private void onUpdate() {
this.lastUpdated = new LocalDateTime();
}
当我测试一个正在更新的品牌时,我创建了品牌,修改它,然后调用更新,之后我重新获取品牌以断言我可以通过更改后的值找到它。
保存和更新之间的时间通常很短,最终日期相同:
assertThat(first.getLastUpdated().isBefore(brand.get().getLastUpdated())).isEqualTo(true);
我目前通过在保存和更新之间添加一个 Thread.sleep(100)
调用来解决这个问题,但我的直觉告诉我这是一个非常糟糕的主意。想法?
如果您使用的是 Java 8,注入一个 Clock 协作者会更干净,您可以控制它来进行测试。
总的来说,我认为是的,这是个坏主意。
测试(当然包括集成测试)必须尽可能快。如果您有下降代码库和下降数量的集成测试,那么像这样的睡眠可能会花费几分钟甚至几小时。如果您运行宁持续集成,这可能是一个重要问题,因为您需要快速构建。
当涉及到日期时,最好使用一些模拟 运行 而不是代码中的真实代码。这实际上取决于您如何准确地使用 Dates 来提供一个很好的例子。通常它需要在这些特定区域重构您的代码。
好消息是,通常像这样的大部分代码都可能完全被单元测试覆盖,因此您不需要复杂的设置。可能您的集成测试会少得多,一个组件可能只有一两个。