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