如何测试持久层?

时间:2015-01-18 23:22:42

标签: java hibernate jpa testing integration-testing

我正在开发一个多层和多模块的Web项目。对于持久层,我正在使用JPA 2.1和Hibernate 4.2以及测试JUnit 4。 在这个架构中,我的项目分为以下几类:

GenericDAO (interface);
GenericDAOImpl (implementation);
EntityDAOImpl (inherits from GenericDAOImpl);
GenericService (interface);
GenericServiceImpl (implementation);
EntityServiceImpl (inherits from GenericServiceImpl);
Entity (POJO).

实体可以是任何对象:用户,帐户,城市,国家......

当然,这些实体彼此依赖,并且一对一,一对多,多对多映射多对多。 我想测试这些实体是否在数据库中正确地保持它们的关系。

我开始使用spring提供的内存数据库(HSQLDB)开发测试。我创建了一个泛型类测试GenericServiceTest,它测试我的类方法GenericServicesImpl并为每个特定实体扩展,例如EntityServiceTest。

然后,当您运行测试类EntityServiceTest时,将继承位于GenericServiceTest类中的所有JUnit方法和注释,并执行对此特定实体的测试。

为了模拟对象,我使用了fixture对象(假对象)。但是,由于这种关系,我正在进行大量工作来测试实体之间的持久性。这样的问题:在保存对象之前必须恢复数据库的非空属性(字段)取决于他。

我的怀疑是:

  • 有没有更好的方法来测试这种关系的持续性?
  • 以这种方式测试服务层是否常见?
  • 我是否可以说这种测试是集成测试,一旦我测试服务层和持久层之间的集成?

我感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

从我的角度来看,你专注于错误的事情

  

我想测试这些实体是否在数据库中正确保持它们的关系。

这看起来像测试JPA实现(在这种情况下是Hibernate)是否正确实现。测试持久性本身并没有那么有意义,因为在这种情况下,您正在测试外部系统而不是代码。

如果您需要真正测试持久性,则应使用以下方案:

@Test
public void persistingUser_ShouldWorkCorrectly() {
    // arrange
    User user = createUser();

    // act
    userDAO.save(user);

    // assert
    assertThat(user).hasName(...)
                    .livesInCity(...)
                    .livesInCountry(...);
}