API java.util.Date
очень, очень старый. Он был заменен Calendar
API, который также является старым, устаревшим и плохим, и который, в свою очередь, был заменен java.time
API - посмотрите, сколько лет j.u.Date
?
В любом случае, j.u.Date
просто не позволяет то, что вам нужно здесь. Он не поддерживает пользовательские часы.
Но java.time
DOES .
Вы можете позвонить: Instant.now()
, что является новым API-эквивалентом new Date()
(juDate эпически плохо назван. Он не представляет даты вообще; он представляет моменты во времени). Есть вариант вызова: Instant.now(clock)
. Это позволяет выбрать пользовательские часы.
Организовать код для получения экземпляра часов, который можно использовать, например, с помощью внедрения зависимостей, или иметь возможность установить его, с неустановленными часами, означающими, что вы по умолчанию используете систему clock (Clock.systemUTC()
), но вы можете реализовать свой собственный экземпляр clock, который действительно может делать именно то, что вам нужно: тестовый код «настраивает» часы так, чтобы они возвращали любые даты / время, необходимые для теста, без необходимости возиться с вашим Часы компьютера вообще.
Итак, ваше трехшаговое решение:
Исключите все использование старого API: java.text.DateTimeFormat
, java.util.Date
, java.sql.Timestamp
все это нужно go прочь. Используйте взамен java.time.Instant
, java.time.LocalDateTime
, java.time.LocalDate
, java.time.ZonedDateTime
, et c (у нового API гораздо больше типов, потому что время по своей природе более сложное, чем думает j.u.Date
; оно является одним из многие fl aws этого старого API. Также исключите ВСЕ вызовы System.currentTimeMillis()
. Все, что получает «текущее время» с точки зрения устаревшего API, должно go.
Установите какое-либо решение для внедрения зависимостей (напишите его самостоятельно или используйте готовые решения, такие как кинжал, guice, spring и т. Д. c), чтобы можно было внедрить экземпляр Clock. Используйте форму Instant.now(clock)
для получить «текущую» дату и время, и никогда без аргументов Instant.now()
.
Реализуйте пользовательское значение часов и используйте его для установки всех различных точек в вашем коде, которые запросить «текущую дату / время», чтобы добавить эти «тестовые часы».
Затем, вуаля. Test valhalla.