使用JPA测试存储层的测试和测试方法

时间:2015-03-20 17:08:57

标签: java database unit-testing jpa dao

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

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

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

数据库

  • 我应该测试连接吗?

模型

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

存储逻辑(DAO)

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

存储层

  • 我应该进行包含DAO,JPA和DB的集成测试吗?
  • 我应该使用测试数据库测试存储层逻辑吗?
  • 如果我使用测试数据库,应该填充专门为测试创建的众所周知的数据,以便在我的测试中做出正确的断言?例如测试,如果我要求作者X的所有书籍,我会得到所有书籍。
  • 我应该测试类似于将操作委托给JPA的列表吗?

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

1 个答案:

答案 0 :(得分:1)

非常广泛的话题,容易出现个人经历和品味。我不相信你能在这里得到一个好的答案。

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

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

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

再一次,容易讨论(所以如果有人不同意请写下你自己的答案而不是参与评论反弹),但更具体一点:

  • 测试连接没有意义,它将与其他测试和有意义的堆栈跟踪相结合。事实上你在测试中有连接,并不意味着你将在实际代码中拥有它,因为它取决于perstitence配置。

  • 你怎么测试你的模型。吸气者和二传手......不。模型中没有连接,只有对象/集合引用。要测试关系到db的正确映射,需要DB后端和JPA处理它们,因此无法在没有集成测试的情况下测试关系。如果字段和数据库表之间不匹配,则简单插入将引发错误。所以是的,你至少应该坚持一个对象,为了映射验证。

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