Java Hibernate测试:持久化的对象依赖链

Java Hibernate测试:持久化的对象依赖链,java,unit-testing,hibernate,junit,jmock,Java,Unit Testing,Hibernate,Junit,Jmock,我正在为DAO层准备单元测试,DAO层与实体对象交互,以便持久化到数据库中 技术 冬眠 Java 1.6 朱尼特 假设我想创建测试方法addEntityA() 为此,我创建了EntityA对象。现在的问题是EntityA是EntityB的孩子。所以我必须在EntityA中指定EntityB的引用。仅当首先持久化EntityB时,EntityA才会持久化到数据库中。所以为了测试EntityA的持久性,我将测试EntityB的持久性。通过这种方式,它可以产生一系列实体,这些实体必须在实际持久化Ent

我正在为DAO层准备单元测试,DAO层与实体对象交互,以便持久化到数据库中

技术 冬眠 Java 1.6 朱尼特

假设我想创建测试方法addEntityA()

为此,我创建了EntityA对象。现在的问题是EntityA是EntityB的孩子。所以我必须在EntityA中指定EntityB的引用。仅当首先持久化EntityB时,EntityA才会持久化到数据库中。所以为了测试EntityA的持久性,我将测试EntityB的持久性。通过这种方式,它可以产生一系列实体,这些实体必须在实际持久化EntityA进行测试之前持久化。有人可能会说,我应该给出已经持久化的EntityB对象的引用。但问题是,我不想让测试用例依赖于数据库中的测试,而不是测试数据。我对JMock解决的问题有一些相似之处,但不确定JMock在这里是否有用


如果问题不清楚,请告诉我

不确定您的实际问题是什么,但在我看来,测试Hibernate/JPA功能的最佳方法是使用内存数据库和合适的测试工具。对于测试工具,我指的是一个用于持久性相关类的基类,它将在每个测试(可能只是每个测试类)创建和删除内存中的数据库。测试线束还应提供对您在测试期间使用的实体管理器或会话的访问。 如果您对配置文件使用筛选,则可以使用属性切换数据库,以便针对“真实”数据库进行测试。 最后但并非最不重要的一点是,如果EntityA测试需要EntityB,则需要在测试设置或测试本身中创建EntityB。
查看Hibernate Core的测试工具,了解测试是如何进行的。

不确定您的实际问题是什么,但我认为测试Hibernate/JPA功能的最佳方法是使用内存中的数据库和合适的测试工具。对于测试工具,我指的是一个用于持久性相关类的基类,它将在每个测试(可能只是每个测试类)创建和删除内存中的数据库。测试线束还应提供对您在测试期间使用的实体管理器或会话的访问。 如果您对配置文件使用筛选,则可以使用属性切换数据库,以便针对“真实”数据库进行测试。 最后但并非最不重要的一点是,如果EntityA测试需要EntityB,则需要在测试设置或测试本身中创建EntityB。
查看Hibernate Core的测试工具,了解测试是如何完成的。

将问题一分为二。让您的生产代码依赖于一个干净的接口,该接口可以根据需要进行模拟。然后使用与数据库对话的层实现该接口。使用真实数据库的实例测试该层,因为Hibernate失败更多地与映射有关,而不是与代码有关。寻找“端口和适配器体系结构”了解更多想法。

将问题一分为二。让您的生产代码依赖于一个干净的接口,该接口可以根据需要进行模拟。然后使用与数据库对话的层实现该接口。使用真实数据库的实例测试该层,因为Hibernate失败更多地与映射有关,而不是与代码有关。有关更多想法,请参阅“端口和适配器体系结构”