Предположим, что вы проводите интеграционное тестирование, вы сохраняете какую-то более крупную сущность в db, а затем читаете ее обратно и хотели бы сравнить.Очевидно, у него также есть некоторые ассоциации, но это просто вишня поверх очень неприятного торта.Как вы сравниваете эти лица?Я видел много неправильных идей и чувствую, что это должно быть написано вручную.Как вы, ребята, делаете это?
Проблемы:
- вы не можете использовать equals / hashcode: это для естественного идентификатора.
- вы не можете использовать подкласс с фиксированными равенствами,так как это протестирует другой класс и может дать неверные результаты при сохранении данных, поскольку данные обрабатываются по-разному в контексте постоянства.
- много полей: вы не хотите вводить все сравнения вручную.Вы хотите отражение.
- @ Временные аннотации: вы не можете использовать тривиальные подходы "отражение равно", потому что @Temporal (TIMESTAMP) java.util.Date <> java.sql.Date
- ассоциации:Типичная сущность, которую вы хотите правильно протестировать, будет иметь несколько ассоциаций, поэтому инструмент / подход в идеале должен поддерживать глубокое сравнение.Также циклы в графе объектов могут испортить удовольствие.
Лучшее решение, которое я нашел:
- не использовать трансмогрифицирующие типы данных (такие как Date) в сущностях JPA.
- все ассоциации должны быть инициализированы в сущности, поскольку пустой список <> пуст.
- вычисляет externalst toString через скажем ReflectionToStringBuilder и сравнивает их.Причина этого заключается в том, чтобы позволить объекту иметь его toString, тесты не должны зависеть от того, что кто-то что-то не меняет.Теоретически, toString может быть глубоким, но рекурсивное использование обыкновенных toStringStyle включает в себя идентификатор объекта, который разрушает его.
- Хотя я могу использовать формат json для строки, но поддержка общего достояния только для поверхностного toString, Джексон (без дальнейшегоинструкции по сущности) не выполняется в циклах по ассоциациям
Альтернативным решением было бы фактически объявить подклассы с созданным идентификатором (скажем, lombok) и использовать некоторый инструмент автоматического сопоставления (скажем, remondis mapper) с возможностью преодоления различий вДаты / коллекции.
Но я слушаю.У кого-нибудь есть лучшее решение?