java - 如何测试持久层?

标签 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 方法和注释都将被继承,并执行对该特定实体的测试。

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

我的疑问是:

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

感谢您的帮助!

最佳答案

在我看来,您关注的是错误的事情

I would like testing whether such entities are being persisted, with their relationships, correctly on database.

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

如果需要真正真正测试持久化,应该使用以下场景:

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

    // act
    userDAO.save(user);

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

关于java - 如何测试持久层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015981/

相关文章:

java - 在 Java Web 应用程序中定期更新数据库的最佳方式

java - Stanford 词性标注器在 Java 中的使用

java - 哪个管理 API 实现了 Auth0 Groups 功能

jakarta-ee - "JBAS016069: Error injecting persistence unit into CDI managed bean."部署依赖于 EJB-JAR 的 WAR 时

hibernate - 为什么实体管理器返回空值对象?

hibernate - JPA 注释 = EJB3 注释 = Hibernate 注释?

java - 在JSP中获取Hibernate初始化对象

java - 如何在 Hibernate/javax.persistence 中映射一个类和多个表?

java - org.hibernate.dialect.PostgreSQLDialect 已弃用

java - 在多个项目中使用同一个 Hibernate 管理的数据库会导致问题吗?