Как смоделировать отметку времени и функцию даты в 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?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval, YearWeek, YearQuarter и многое другое.

Другие вопросы по тегам