$datediff = floor(strtotime($date1)/(60*60*24)) - floor(strtotime($date2)/(60*60*24));
и, при необходимости:
$datediff=abs($datediff);
Я предполагаю, что 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();
Все остальное точно так же, как и раньше.