Больше точности при сравнении двух дат, которые представляют собой два часа - PullRequest
0 голосов
/ 16 января 2019

Можно ли это проверить с большей точностью? Это простая функция, которая вычисляет 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 голосов
/ 17 января 2019

Я предполагаю, что calculateExecutionStartTime возвращает время, которое составляет два часа назад по сравнению со временем, когда вы вызываете метод, и это то, что вы хотите проверить. В своем первом предложении я также предполагаю, что вы можете изменить метод, чтобы он возвращал современный Instant вместо устаревшего Date. Поскольку вы можете использовать java.time, современный Java-интерфейс даты и времени, это сразу выглядело бы как простое улучшение.

Проблема в том, что вызов может занять несколько миллисекунд, даже несколько секунд, и мы не знаем, в какой момент времени во время вызова он читает часы. Поэтому мы не проводим тестирование с использованием assertEquals с ожидаемым временем. Вместо этого мы читаем часы до и после звонка. Тогда наш тест может полагаться на метод, считывающий часы в некоторый момент между нашими двумя вызовами. В большинстве случаев это позволит нам проверить возвращаемое время с небольшим запасом. Идея уже была представлена ​​Даудом ибн Каримом в комментарии.

@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();

Остальное точно так же, как и раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...