java - 使用 JPA 实现的存储层需要进行哪些测试以及如何测试

标签 java database unit-testing jpa dao

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

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

我正在尝试了解如何在存储层中测试以及测试什么内容。

数据库

  • 我应该测试连接吗?

型号

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

存储逻辑(DAO)

  • 我应该测试 DAO 吗?
  • 我应该测试 DAO 将其与 EntityManagerFactory 隔离吗?

存储层

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

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

最佳答案

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

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

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

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

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

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

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

  • 是的,您应该测试您的检索/搜索方法。这是您的集成测试,也是您可以确定所有层是否按预期工作的唯一地方。

关于java - 使用 JPA 实现的存储层需要进行哪些测试以及如何测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29172133/

相关文章:

python - web.py select 不返回结果,但该列表的长度确实返回(sql promt 中的手动查询也返回结果)

c# - 不存在的通用参数的单元测试

android - 我如何使用 Adob​​e Dreamweaver 6 和 PhoneGap 编写数据库驱动的 iOS、Android 等应用程序?

java - App Engine 云存储 RequestPayloadTooLargeException 文件超出 10 MB 限制

java - 使用 c :redirect? 重定向用户浏览器是否安全

java - Android:包含标题和副标题的列表项的默认布局

javascript - 需要帮助来确定如何构建我的项目

unit-testing - 禁止 F# 编译器警告 : Possible incorrect indentation: this token is offside of context

unit-testing - 如何在每次 Jest 测试运行之前运行一些配置

java - 在 Java 中读取 BIG XML 文件的一小部分的有效方法