Формат даты в тестировании весеннего загрузочного репозитория - PullRequest
0 голосов
/ 12 февраля 2020

Я использую следующие коды для тестирования интеграции функций репозитория. Однако это не удастся из-за даты formart. Выходные данные SimpleDateFormat: «Среда 01 января 10:10:10 MST 2020», но дата из базы данных «2020-01-01 10: 10: 10.0». Есть ли какой-нибудь простой способ решить эту проблему?

      Optional<TestBean> testBean = testBeanRepository.findById(1L);
      TestBean toReturn = new TestBean();
      toReturn.setAccountNumber(123456789);
      toReturn.setId(1L);
      toReturn.setCustomerName("Peter");
      toReturn.setModifiedDate(new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").parse("2020-01-01 10:10:10"));
      assertThat(testBean)
         .isPresent()
         .hasValue(toReturn);

Так я определил дату изменения (java .util.date):

@Column(name = "MODIFIED_DATE_TIME") 
@NotNull 
@Temporal(TemporalType.TIMESTAMP) 
private Date modifiedDate;

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Мне кажется, что TestBean объявлен для хранения java.util.Date, но экземпляр TestBean, возвращенный из findById(), вместо этого содержит java.sql.Timestamp. Это очень неудачно (если это правда).

Timestamp реализовано как подкласс Date. Оба класса плохо разработаны и давно устарели, мы не должны больше их использовать. Несмотря на отношения подкласса, согласно документации, мы не должны рассматривать Timestamp как разновидность Date. Реализация Timestamp как подкласса Date - это настоящий взлом. И помещать Timestamp в Date поле вашего объекта неправильно. Я также не думаю, что когда-либо намеревалось использовать Timestamp в наших модельных компонентах. Он предназначался для передачи данных в SQL столбцы базы данных с типом данных timestamp и timestamp with time zone.

. Поэтому хорошее решение: измените класс TestBean на современный объект даты и времени. принадлежащий к классу java .time, современному Java API даты и времени. Редактировать: Поскольку тип данных в MySQL равен datetime, наилучшее совпадение в Java равно LocalDateTime. LocalDateTime - это дата и время дня без часового пояса или смещения UT C.

Если вы не можете изменить тип, объявленный в классе TestBean, есть еще несколько возможных улучшений:

  • Убедитесь, что объект содержит объект Date, как он объявлен, а не Timestamp.
  • Добавьте метод получения и установки, которые возвращают и принимают Instant вместо Date, чтобы ваш класс мог лучше взаимодействовать с кодом, используя java .time. Новые методы сделали бы необходимое преобразование. Затем используйте новый установщик для установки значения в toReturn.

Если вы не можете сделать ничего из этого, и вы вынуждены быть частью хака, есть, конечно, способы установить modifiedDate на старомодный Timestamp. Я предлагаю:

    toReturn.setModifiedDate(Timestamp.from(Instant.parse("2020-01-01T17:10:10Z")));

Я дал время как 17:10:10. Это время в UT C (обозначается Z). Я предположил, что MST, упомянутый в вашем вопросе, является североамериканским горным стандартным временем (а не малайзийским стандартным временем?), И если да, то это время соответствует желаемому 10:10:10 в вашем часовом поясе.

Ссылки

0 голосов
/ 12 февраля 2020

Что вы делаете, это синтаксический анализ (строка в дату), вам нужно отформатировать (дата в строку).

SimpleDateFormat readFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");

Optional<TestBean> testBean = testBeanRepository.findById(1L);
TestBean toReturn = new TestBean();
toReturn.setAccountNumber(123456789);
toReturn.setId(1L);
toReturn.setCustomerName("Peter");
toReturn.setModifiedDate(writeFormat.format(readFormat.parse("2020-01-01 10:10:10")));
assertThat(testBean)
        .isPresent()
        .hasValue(toReturn);

Здесь readFormat и writeFormat одинаковы, но могут отличаться.

...