比较两个日期(两个小时)的精度更高

时间:2019-01-16 19:33:46

标签: java datetime assertion

可以更精确地测试吗?这是一个简单的函数,可将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));
}

1 个答案:

答案 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()来读取时钟。您不需要ZonedDateTimeZoneOffset

如果您无法更改calculateExecutionStartTime的返回类型,只需转换从中获得的Date

    Instant executionStartTime = proxy.calculateExecutionStartTime(
                    properties.getMessageConfiguration().getExecutionStartTime())
            .toInstant();

其余与以前完全一样。