0

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

技术 Hibernate Java 1.6 JUnit

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

为此,我创建了 EntityA 对象。现在的问题是 EntityA 是 EntityB 的子级。所以我必须在EntityA中指定EntityB的引用。只有当 EntityB 先被持久化时,EntityA 才会被持久化到数据库中。因此,为了测试 EntityA 的持久性,我将测试 EntityB 的持久性。这样,它可以导致实体链必须在 EntityA 实际持久化以进行测试之前持久化。有人可能会争辩说我应该引用已经持久化的 EntityB 对象。但问题是我不想让测试用例依赖于数据库中的测试而不是测试数据。我与 JMock 解决的问题有些相似,但不确定 Jmock 在这里如何以及是否有用?

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

4

2 回答 2

2

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

于 2010-12-30T11:55:19.253 回答
1

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

于 2010-12-31T10:19:19.560 回答