集成测试,比较JPA实体

时间:2018-11-30 12:25:39

标签: jpa reflection integration-testing

考虑您要进行一些集成测试,您将一些较大的实体存储到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),并具有克服日期/集合差异的选项。

但是我在听。有谁能提供更好的解决方案?

0 个答案:

没有答案