Я предполагаю, что 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();
Остальное точно так же, как и раньше.