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 实现的实现。
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 实现的实现。