интеграционное тестирование, сравнение объектов JPA - PullRequest
0 голосов
/ 30 ноября 2018

Предположим, что вы проводите интеграционное тестирование, вы сохраняете какую-то более крупную сущность в db, а затем читаете ее обратно и хотели бы сравнить.Очевидно, у него также есть некоторые ассоциации, но это просто вишня поверх очень неприятного торта.Как вы сравниваете эти лица?Я видел много неправильных идей и чувствую, что это должно быть написано вручную.Как вы, ребята, делаете это?

Проблемы:

  • вы не можете использовать equals / hashcode: это для естественного идентификатора.
  • вы не можете использовать подкласс с фиксированными равенствами,так как это протестирует другой класс и может дать неверные результаты при сохранении данных, поскольку данные обрабатываются по-разному в контексте постоянства.
  • много полей: вы не хотите вводить все сравнения вручную.Вы хотите отражение.
  • @ Временные аннотации: вы не можете использовать тривиальные подходы "отражение равно", потому что @Temporal (TIMESTAMP) java.util.Date <> java.sql.Date
  • ассоциации:Типичная сущность, которую вы хотите правильно протестировать, будет иметь несколько ассоциаций, поэтому инструмент / подход в идеале должен поддерживать глубокое сравнение.Также циклы в графе объектов могут испортить удовольствие.

Лучшее решение, которое я нашел:

  • не использовать трансмогрифицирующие типы данных (такие как Date) в сущностях JPA.
  • все ассоциации должны быть инициализированы в сущности, поскольку пустой список <> пуст.
  • вычисляет externalst toString через скажем ReflectionToStringBuilder и сравнивает их.Причина этого заключается в том, чтобы позволить объекту иметь его toString, тесты не должны зависеть от того, что кто-то что-то не меняет.Теоретически, toString может быть глубоким, но рекурсивное использование обыкновенных toStringStyle включает в себя идентификатор объекта, который разрушает его.
  • Хотя я могу использовать формат json для строки, но поддержка общего достояния только для поверхностного toString, Джексон (без дальнейшегоинструкции по сущности) не выполняется в циклах по ассоциациям

Альтернативным решением было бы фактически объявить подклассы с созданным идентификатором (скажем, lombok) и использовать некоторый инструмент автоматического сопоставления (скажем, remondis mapper) с возможностью преодоления различий вДаты / коллекции.

Но я слушаю.У кого-нибудь есть лучшее решение?

...