什么测试以及如何测试使用 JPA 实现的存储层

Posted

技术标签:

【中文标题】什么测试以及如何测试使用 JPA 实现的存储层【英文标题】:What test and how test a storage layer implemented using JPA 【发布时间】:2015-05-24 04:38:06 【问题描述】:

我想测试我的应用程序的存储层。存储层访问数据库并使用 JPA 将模型与数据库模式映射。

以用于可视化书籍的应用程序的存储层为例。该模型有两个实体:书籍和作者。一本书可以有一个或多个作者。存储层公开了列出书籍、作者或更复杂操作的方法,例如某个作者的所有书籍。

我正在尝试了解在存储层中测试的方式和内容。

数据库

我应该测试连接吗?

型号

我应该测试模型吗? 我应该测试模型中的 JPA 注释吗?例如书籍和作者之间的连接。 我是否应该测试模型是否与架构匹配?例如字段和表名称。

存储逻辑 (DAO)

我应该测试 DAO 吗? 我是否应该测试将 DAO 与 EntityManagerFactory 隔离开来?

存储层

是否应该进行包含 DAO、JPA 和 DB 的集成测试? 我应该使用测试数据库测试存储层逻辑吗? 如果我使用测试数据库,是否应该填充专门为测试创建的众所周知的数据,以便在我的测试中做出正确的断言?例如,测试如果我要作者 X 的所有书籍,我会得到所有书籍。 我应该测试像清单这样简单地将操作委托给 JPA 的方法吗?

欢迎提出其他问题和建议。

【问题讨论】:

【参考方案1】:

非常广泛的主题,容易受到个人经验和品味的影响。我不相信你可以在这里得到一个好的答案。

实际上,它是集成测试而不是单元测试。要进行单元测试,您必须模拟几乎所有内容。

是的,您的数据库应该包含众所周知的数据。它不仅应该包含您用于特定测试的数据(例如只有一位作者),还应该包含其他“兄弟”数据来捕捉副作用,而不是唯一的结果......

有一篇关于数据层测试的好文章: http://www.petrikainulainen.net/writing-tests-for-data-access-code/

再次,容易引起讨论(因此,如果有人不同意,请写下您自己的答案,不要参与 cmets 弹跳),但要更具体:

测试连接没有意义,它会使其他测试崩溃并带有有意义的堆栈跟踪。此外,您在测试中有连接并不意味着您将在实际代码中拥有它,因为它取决于持久性配置。

如何测试您的模型。吸气剂和二传手……不。模型中没有连接,只有对象/集合引用。要测试与 db 的关系的正确映射,您需要 DB 后端和 JPA 处理它们,因此如果没有集成测试,您将无法测试关系。如果字段和数据库表不匹配,简单插入会引发错误。所以是的,为了映射验证,您至少应该保留一个对象。

是的,您应该测试您的检索/搜索方法。这是您的集成测试,如果所有层都按预期工作,您唯一可以找到的地方。

【讨论】:

你认为像listing这样简单的方法值得测试吗?为了测试映射是否真的有必要进行插入,或者例如列出所有模型实体就足够了? Insert 解决了 ID 生成策略、外键/索引约束等问题。我经常遇到由它们引起的错误,所以我总是尝试持久化实体,检索它并删除它。不知道您所说的简单列表是什么意思,但如果它是一个 wraper arround find all query 我会说不。

以上是关于什么测试以及如何测试使用 JPA 实现的存储层的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA:在 CI 环境中使用多个数据库测试 DAO 层

如何测试休眠通用 dao 模式

Spring 单元测试 JPA 存储库

基于 JPA 的 JUnit 测试最佳实践

使用Spring BOOT集成测试JPA存储库时的NoSuchMethodError(getMetaModel)

在 Spring Boot 应用程序的 JUnit 测试中,自动装配的 JPA 存储库没有合格的 bean