可以更精确地测试吗?这是一个简单的函数,可将executionStartTime
计算为比currentTime
晚两个小时。
下面的函数有效,但是我想要一个更精确的函数。
@Test
public void testCalculateExecutionStartTime() {
Date currentTime = new Date(ZonedDateTime.now(ZoneOffset.UTC).toEpochSecond() * 1000);
Date executionStartTime = proxy.calculateExecutionStartTime(properties.getMessageConfiguration().getExecutionStartTime());
Assert.assertTrue(currentTime.after(executionStartTime));
}
答案 0 :(得分:2)
我假设calculateExecutionStartTime
返回的时间比调用该方法的时间要早两个小时,这就是您要测试的时间。在我的第一个建议中,我进一步假设您可以更改方法以返回现代Instant
而不是过时的Date
。由于您可以使用现代Java日期和时间API java.time,因此这看起来像是一个简单的改进。
挑战在于通话可能要花费几毫秒,甚至几秒钟,而且我们不知道通话过程中的哪个时间点正在读取时钟。因此,没有使用assertEquals
进行预期的测试。相反,我们在呼叫之前 和 读取时钟。然后,我们的测试可以依靠在两次调用之间的某个时刻读取时钟的方法。在大多数情况下,这将使我们能够以很小的幅度测试返回的时间。达伍德·伊本·卡里姆(Dawood ibn Kareem)已经在评论中提出了这个想法。
@Test
public void testCalculateExecutionStartTime() {
Instant timeBefore = Instant.now();
Instant executionStartTime = proxy.calculateExecutionStartTime(
properties.getMessageConfiguration().getExecutionStartTime());
Instant timeAfter = Instant.now();
Duration expectedTimeAgo = Duration.ofHours(2);
Assert.assertFalse(executionStartTime.isBefore(timeBefore.minus(expectedTimeAgo)));
Assert.assertFalse(executionStartTime.isAfter(timeAfter.minus(expectedTimeAgo)));
}
请注意使用Instant.now()
来读取时钟。您不需要ZonedDateTime
或ZoneOffset
。
如果您无法更改calculateExecutionStartTime
的返回类型,只需转换从中获得的Date
:
Instant executionStartTime = proxy.calculateExecutionStartTime(
properties.getMessageConfiguration().getExecutionStartTime())
.toInstant();
其余与以前完全一样。