Редактировать: Если я правильно понимаю (не знаком с Hamcrest), вам нужно вставить старомодный объект java.util.Date
в конструктор EquityFeeds
и проверить, что значение long
, которое вы получите обратно - 1385058600000L
или 1 385 058 600 000 - согласен с указанным вами Date
.
java .time
Для построения java.util.Date
, что вам нужно:
Instant transactionTime = LocalDate.of(2013, Month.NOVEMBER, 22)
.atStartOfDay(ZoneId.systemDefault())
.toInstant();
Date oldfashionedDate = Date.from(transactionTime);
System.out.println(oldfashionedDate);
Вывод данных при работе в часовом поясе Азия / Калькутта:
Пт 22 ноября 00:00:00 IST 2013
Теперь просто передайте oldfashionedDate
как шестой аргумент конструктора EquityFeeds
. Суть в приведенных выше строках кода заключается не только в том, что мы используем java .time, современный Java API даты и времени, и очень ясно из кода, что он делает; это также облегчает тестирование. Чтобы получить ожидаемое значение long
:
long expectedTransactionDateMillis = transactionTime.toEpochMilli();
System.out.println(expectedTransactionDateMillis);
1385058600000
Не будучи знакомым с Hamcrest и не попробовав, я бы ожидал, что вам просто нужно заполнить это значение в вашем утверждении:
.andExpect(jsonPath("$.transactionDate", Matchers.is(expectedTransactionDateMillis)))
Класс java.util.Date
плохо спроектирован и давно устарел. Я рекомендую не использовать его, и еще более настоятельно рекомендую не использовать общеизвестно хлопотный класс SimpleDateFormat
. Несмотря на то, что Date
используется в вашем производственном коде по историческим причинам, я не вижу причин, почему вы должны повторить эту ошибку в своих тестах. Используйте java .time, с ним гораздо приятнее работать. И преобразования существуют, когда вам нужен объект одного из устаревших типов, например Date
.
Что пошло не так в вашем тесте?
Ваша первая попытка:
.andExpect(jsonPath("$.transactionDate", Matchers.is(dateFormat.parse("22/11/13"))))
Результат dateFormat.parse("22/11/13")
равен java.util.Date
. Даже если это равно Date
в вашем POJO, значение в вашем JSON - это long
, представляющее количество миллисекунд с начала эпохи (эту практику вы можете изменить, если сможете). Поскольку Date
и long
никогда не могут быть равны, ваш тест не пройден.
Затем вы попытались:
.andExpect(jsonPath("$.transactionDate", Matchers.is(Date.parse("22/11/13"))))
Теперь вы получаете значение long
в порядке. Мы видим, что ожидаемые и фактические значения имеют одинаковый формат в печатном виде. Есть две неправильные вещи:
- Вы используете метод
Date.parse
, который устарел с 1997 года. Так было, потому что он работает ненадежно во всех часовых поясах. Даже если вы настаивали на использовании Date
, вы все равно должны держаться подальше от этих устаревших методов и конструкторов. - Ваша строка даты разбирается на 1 412 965 800 000, что равно 2014-10-11T00: 00 +05: 30, так что сейчас почти год. Этот метод не только устарел, но также сбивает с толку и анализирует вашу строку даты как 11-й день 22-го месяца 2013 года. 22-го месяца года нет, но метод
parse
просто экстраполирует, продолжает подсчитывать месяцы до 2014 и заканчивается в октябре того года. Еще одна причина не использовать этот метод.
Ссылка
Oracle учебник: Дата и время , объясняющие, как использовать java .time.