RevisionRepository return 具有不同 List 实现的实体(PersistanceBag ->ListProxy)

RevisionRepository return entity with different List implementation (PersistanceBag ->ListProxy)

org.springframework.data.repository.history.RevisionRepository
Entity entity = repository.findLastChangeRevision(entity.getId()).get().getEntity();

return 列表为 ListProxy 的实体。

普通 CrudRepository

repository.findById(id)

return 具有相同内容的相同实体,但列表类型为 PersistentBag。

在集成测试中断言这两个对象时存在这种差异大小写问题。

有什么解决办法吗?

不要测试是否相等,而是测试内容是否相等。如何做到这一点取决于您使用的测试和断言库。

例如 AssertJ 对此有 containsExactlyInAnyOrder and containsExactly

一些模糊的背景

Hibernate 和一般所有 JPA 实现和大多数 ORM replace/manipulate 您的 classes 的字节码或使用代理或特殊实现来完成它们的工作。一个重要的部分是脏跟踪,即 JPA 会在您更改实体时注意到,例如通过将元素添加到集合中。为了做到这一点,他们将不得不做一些魔术,比如用其他一些 class 替换您的列表,通知 JPA 实施此类操作。

因此,您可能会在实体实例中找到 JPA 实现的实现。