考虑您要进行一些集成测试,您将一些较大的实体存储到db中,然后将其读回并希望进行比较。显然,它也有一些关联,但这只是非常令人讨厌的蛋糕之上的一颗樱桃。您如何比较这些实体?我看到很多不正确的想法和感觉,必须手动编写。你们是怎么做到的?
问题:
- 您不能使用equals / hashcode:这些用于自然ID。
- 您不能使用具有固定等式的子类,因为这会测试不同的类,并且由于在持久性上下文中对数据的处理方式不同,因此在持久化数据时会给出错误的结果。
- 很多字段:您不想手动输入所有比较。你要反思。
- @Temporal批注:您不能使用简单的“等于反射”方法,因为@Temporal(TIMESTAMP)java.util.Date <> java.sql.Date
- 关联:您想要正确测试的典型实体将具有多个关联,因此理想情况下,工具/方法应支持深度比较。对象图中的循环也会破坏乐趣。
我发现的最佳解决方案:
- 请勿在JPA实体中使用可迁移的数据类型(例如Date)。
- 所有关联都应在实体中初始化,因为null <>空列表。
- 通过说ReflectionToStringBuilder计算外部toString,并进行比较。这样做的原因是允许实体拥有其toString,测试不应该依赖于某人未进行任何更改。从理论上讲,toString可以很深,但是公共递归toStringStyle包含对象标识符,这会破坏它。
- 虽然我可以使用json格式进行字符串化,但是公共支持仅针对浅层toString,Jackson(没有关于实体的进一步说明)在关联循环上失败
替代解决方案实际上是声明具有生成ID的子类(例如lombok),并使用一些自动映射工具(例如remondis mapper),并具有克服日期/集合差异的选项。
但是我在听。有谁能提供更好的解决方案?