Как изменить значение новой даты () в java - PullRequest
1 голос
/ 28 апреля 2020

В моем приложении дату и время нужно часто менять, когда тестер тестирует приложение. В настоящее время мы должны использовать системную команду date-s для изменения системного времени. Но это также повлияет на другие приложения на сервере. Я хочу изменить Date () только для этого приложения, и я не хотите изменить само приложение, потому что там так много мест, где используется новая дата

1 Ответ

2 голосов
/ 28 апреля 2020

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, который действительно может делать именно то, что вам нужно: тестовый код «настраивает» часы так, чтобы они возвращали любые даты / время, необходимые для теста, без необходимости возиться с вашим Часы компьютера вообще.

Итак, ваше трехшаговое решение:

  1. Исключите все использование старого 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.

  2. Установите какое-либо решение для внедрения зависимостей (напишите его самостоятельно или используйте готовые решения, такие как кинжал, guice, spring и т. Д. c), чтобы можно было внедрить экземпляр Clock. Используйте форму Instant.now(clock) для получить «текущую» дату и время, и никогда без аргументов Instant.now().

  3. Реализуйте пользовательское значение часов и используйте его для установки всех различных точек в вашем коде, которые запросить «текущую дату / время», чтобы добавить эти «тестовые часы».

Затем, вуаля. Test valhalla.

...