2015-11-04 2 views
0

Я пишу интеграционный тест для своих услуг DAO. Я выполняю это с помощью методов ввода dao, а затем считываю объекты из базы данных и утверждаю все поля с оригинальными объектами.Утверждение полей java.util.Date в тесте

Я хочу использовать assertj-core для создания утверждений. Особенно isEqualToComparingFieldByField.

Но есть проблемы с полями java.util.Date. Они возвращают идентичное значение getTime(), но не равны.

В настоящее время я игнорирую эти поля в isEqualToComparingFieldByField, а затем comapre с методом hasSameTimeAs.

assertThat(object).isEqualToIgnoringGivenFields(other, "time"); 
assertThat(object.getTime()).hasSameTimeAs(other.getTime()); 

Есть ли способ, чтобы предоставить пользовательский компаратор методу isEqualToComparingFieldByField для данного типа (в данном случае java.util.Date) или любое другое решение утвердить поле два объекта по полю, избегая этот вопрос?

+0

До класса java 8 date/time рассмотрим равенство 'java.util.Date' только на основе' getTime() 'и для других целей (полей) test Calendar. В Date соответствующий конструктор «field» устарел и советует использовать Calendar. –

ответ

0

Если вы берете свои объекты из sql, вы смешиваете Timestamps и Date.

Date date = theTwoTowers.getReleaseDate(); 
java.sql.Timestamp timestamp = new java.sql.Timestamp(date.getTime()); 

// timestamp is a Date, it can be compared to date 
assertThat(date.equals(timestamp)).isTrue(); 

// as date is not a Timestamp, it can't be equal to timestamp 
assertThat(timestamp.equals(date)).isFalse(); 

Эта ссылка может помочь вам: https://github.com/joel-costigliola/assertj-core/issues/273

+0

Я видел этот конверсион, но он не говорит, как я могу решить свою проблему. Можно ли утверждать поле Date с помощью метода isEqualToComparingFieldByField, например. hasSameTimeAs? Я хочу избежать написания отдельных утверждений только для полей java.util.Date. – IgorekPotworek

+0

Я не думаю, что эта проблема была написана в проблемах assertJ. isEqualToComparingFieldByField может быть переопределен: если элемент объекта Date, вы делаете что-то другое для равенства, но это очень опасно для будущих эволюций/изменений AssertJ. Другой способ сделать то, что вы хотите, - создать ObjectA, чтобы у вас есть YourActualObject = ObjectA + Date. Затем вы можете использовать isEqualToComparingFieldByField для своего объекта B и отдельно проверить свою дату. –

+0

Я присоединяю аналогичное решение в своем вопросе: assertThat (object) .isEqualToIgnoringGivenFields (другое, «время»); assertThat (object.getTime()). HasSameTimeAs (other.getTime()); Итак, нет другого «приятного» решения? – IgorekPotworek

1

Там нет никакого способа задания пользовательского компаратора для данного типа поля в «поле за полем» сравнения - я не уверен, что это элегантный представляя это в AssertJ (но я бы хотел, чтобы вас доказали неправильно).

Что вы можете сделать, это определить компаратор для ваших объектов, и использовать его как это:

assertThat(frodo).usingComparator(raceNameComparator).isEqualTo(pippin); 

См assertj-examples проект для полного рабочего примера.

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

+0

Итак, если AssertJ не поддерживает такие проблемы, не могли бы вы порекомендовать мне другую библиотеку тестирования/утверждения, где я могу сравнить два объекта по полю (включая указанную дату)? – IgorekPotworek

+0

Вы можете попробовать попробовать unitils (http://www.unitils.org/tutorial-reflectionassert.html), также я не знаю, есть ли у вас функция, которую вы ожидаете. –