Утверждение полей java.util.Date в тесте
Я пишу интеграционный тест для своих служб DAO. Я выполняю это, используя dao-методы вставки, а затем читая объекты из базы данных и утверждая все поля оригинальными объектами.
Я хочу использовать assertj-core, чтобы делать утверждения. Особенно isEqualToComparingFieldByField.
Но есть проблема с полями java.util.Date. Они возвращают одинаковое значение getTime(), но не равны.
В настоящее время я игнорирую эти поля в утверждении isEqualToComparingFieldByField, а затем сопоставляю их с методом hasSameTimeAs.
assertThat(object).isEqualToIgnoringGivenFields(other, "time");
assertThat(object.getTime()).hasSameTimeAs(other.getTime());
Есть ли способ предоставить пользовательский компаратор для метода isEqualToComparingFieldByField для данного типа (в данном случае java.util.Date) или любое другое решение для утверждения поля двух объектов по полю, чтобы избежать этой проблемы?
2 ответа
Нет никакого способа указать пользовательский компаратор для данного типа поля в сравнении "поле за полем" - я не уверен, что есть элегантный способ представить это в AssertJ (но я бы хотел оказаться ошибочным).
Что вы можете сделать, это определить компаратор для ваших объектов и использовать его следующим образом:
assertThat(frodo).usingComparator(raceNameComparator).isEqualTo(pippin);
Посмотрите проект assertj-examples для полного рабочего примера.
Я знаю, что для написания Comparator требуется работа, это цена за полный контроль над используемой стратегией сравнения.
Если вы берете свои объекты из sql, вы смешиваете метки времени и дату.
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