使用 Hibernate 进行测试:持久性上的对象依赖链

发布于 2024-10-09 21:12:30 字数 422 浏览 2 评论 0原文

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

技术 休眠 爪哇1.6 JUnit

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

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

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

I am preparing unit tests for DAO layer which interacts with entity objects for persistence in to database.

Technology
Hibernate
Java 1.6
JUnit

Suppose i want to create test method addEntityA()

for doing so i create EntityA object. Now problem is EntityA is child of EntityB. So i must specify reference of EntityB in EntityA. EntityA will be persisted in database only if EntityB is persisted first. So thus to test persistnece of EntityA i will have test persistence of EntityB. this way it can lead to chain of entities which must be persisted before actual persistence of EntityA for testing. One may argue that i should give reference of EntityB object which is already persisted. But problem is that i don't want to make test cases dependent upon test in database rather than test data. Some how i resembles with what JMock solves but not sure how and if Jmock can be useful here?

Please let me know if problem is not clear?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

香草可樂 2024-10-16 21:12:31

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

Not sure what your actual question is, but imo the best approach for testing Hibernate/JPA functionality is to use a in memory database and a decent test harness. With test harness I mean a base class for your persistence related classes which will create and drop your in memory database per test (maybe just per test class). The test harness should also provide access to the entity manager or session you are using during testing.
If you using filtering for your configuration files you can use properties to switch databases in order to test against "real" databases as well.
Last but not least, if your test of EntityA needs an EntityB you will need to create EntityB in the test setup or the test itself.
Have a look at the test harness of Hibernate Core to get an idea how testing is done there.

不忘初心 2024-10-16 21:12:31

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

Split the problem into two. Have your production code depend on a clean interface which can be mocked as you need. And then implement that interface with a layer that talks to the database. Test that layer with an instance of the real database since Hibernate failures are more often to do with the mappings than the code. Look for "Ports and Adapters Architecture" for more ideas.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文