Как смоделировать отметку времени и функцию даты в Java?
Как издеваться над кодом? я не хочу менять свой код
Date date = new Date();
String res_timestamp=new Timestamp(date.getTime()).toString();
мой код:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("PST"));
Date NOW = sdf.parse("2019-02-11 00:00:00");
Timestamp time=new Timestamp(NOW.getTime());
whenNew(Timestamp.class).withNoArguments().thenReturn(time);
как я могу высмеять это? Мне трудно это высмеивать.
как я могу решить это?
примечание: я не хочу менять свой код. не изменяя мой код, я должен высмеивать эти две строки.
1 ответ
ТЛ; др
- использование
java.time.Clock
,ZonedDateTime
,Instant
,ZoneId
, - Введите измененный
Clock
объект как зависимость:Clock.fixed( … )
, - Никогда не используйте
Date
,Calendar
,SimpleDateFormat
,Timestamp
,TimeZone
,
Передать измененный Clock
объект как зависимость
Вы используете ужасные классы даты и времени, которые были вытеснены несколько лет назад классами java.time, определенными JSR 310.
java.time.Clock
Класс предлагает несколько альтернативных поведений, подходящих для тестирования. Они включали в себя фиксированный момент времени, измененные каденции и настройку с текущего момента.
Пройдите один из них Clock
объекты для различных методов в классах java.time для ваших целей тестирования.
PST
это не часовой пояс. Укажите правильное название часового пояса в формате Continent/Region
, такие как America/Montreal
, Africa/Casablanca
, или же Pacific/Auckland
, Никогда не используйте 2-4 буквенное сокращение, такое как EST
или же IST
поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
Создайте конкретный момент для тестирования.
LocalDate ld = LocalDate.of( 2019 , 2 , 11 ) ;
LocalTime lt = LocalTime.MIN ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
zdt.toString (): 2019-02-11T00: 00-08: 00 [America /Los_Angeles]
призвание Clock.fixed
требует Instant
Мгновение в UTC. Мы можем отрегулировать от нашего зонированного значения до UTC, извлекая Instant
, Тот же самый момент, та же самая точка на временной шкале, другое время настенных часов.
Instant instant = zdt.toInstant() ;
instant.toString (): 2019-02-11T08: 00: 00Z
Укажите Clock
это навсегда сообщает текущий момент как этот конкретный момент, без приращения.
Clock clock = Clock.fixed( instant , z ) ;
clock.toString (): FixedClock [2019-02-11T08: 00: 00Z, Америка /Los_Angeles]
Введите фиксированные часы в качестве зависимости.
Instant now = Instant.now( clock ) ; // Tell me a lie.
now.toString (): 2019-02-11T08: 00: 00Z
Смотрите этот код в прямом эфире на IdeOne.com.
JDBC 4.2
Если бы вы были экземпляром java.sql.Timestamp
для использования с базой данных, вместо этого используйте классы java.time. Начиная с JDBC 4.2 мы можем обмениваться объектами java.time с базой данных.
Ваш драйвер JDBC может иметь дополнительную поддержку Instant
,
myPreparedStatement.setObject( … , instant ) ; // Storing data.
Instant instant = myResultSet.get( … , Instant.class ) ; // Retrieving data.
Ваш драйвер должен поддерживать OffsetDateTime
,
myPreparedStatement.setObject( … , instant.atOffset( ZoneOffset.UTC ) ) ; // Storing data.
OffsetDateTime odt = myResultSet.get( … , OffsetDateTime.class ) ; // Retrieving data.
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date
, Calendar
& SimpleDateFormat
,
Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, смотрите Oracle Tutorial. И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классы.
Где взять классы java.time?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного API Java со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранних версий Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). Смотрите Как использовать ThreeTenABP….
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval
, YearWeek
, YearQuarter
и многое другое.