我正在为DAO层准备单元测试,它与实体对象交互以便持久化到数据库中。
技术 过冬 Java 1.6 JUnit的
假设我想创建测试方法addEntityA()
这样做我创建了EntityA对象。现在的问题是EntityA是EntityB的孩子。所以我必须在EntityA中指定EntityB的引用。只有在首先保留EntityB时,EntityA才会保留在数据库中。因此,为了测试EntityA的持久性,我将具有EntityB的测试持久性。这样它就可以导致实体链在实际持久化EntityA之前必须持久化以进行测试。有人可能会争辩说我应该提供已经持久存在的EntityB对象。但问题是我不想让测试用例依赖于数据库中的测试而不是测试数据。一些我如何与JMock解决的问题相似但不确定Jmock如何在这里有用?
如果问题不明确,请告诉我?
答案 0 :(得分:2)
不确定您的实际问题是什么,但是测试Hibernate / JPA功能的最佳方法是使用内存数据库和体面的测试工具。对于测试工具,我的意思是与持久性相关的类的基类,它将为每个测试创建和删除内存数据库(可能只是每个测试类)。测试工具还应提供对测试期间使用的实体管理器或会话的访问。 如果对配置文件使用过滤,则可以使用属性来切换数据库,以便对“真实”数据库进行测试。 最后但并非最不重要的是,如果您对EntityA的测试需要EntityB,您将需要在测试设置或测试本身中创建EntityB。 看看Hibernate Core的测试工具,了解如何在那里进行测试。
答案 1 :(得分:1)
将问题分成两部分。让您的生产代码依赖于一个干净的界面,可以根据需要进行模拟。然后使用与数据库对话的层实现该接口。使用真实数据库实例测试该层,因为Hibernate失败通常与映射有关,而不是代码。寻找“端口和适配器架构”以获得更多创意。