【问题标题】:How to test the persistence layer?如何测试持久层?
【发布时间】:2015-01-18 23:22:42
【问题描述】:

我正在开发一个多层和多模块的网络项目。对于持久层,我使用 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 方法和注释都将被继承,并执行对该特定实体的测试。

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

我的疑问是:

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

感谢您的帮助!

【问题讨论】:

    标签: java hibernate jpa testing integration-testing


    【解决方案1】:

    在我看来,您专注于错误的事情

    我想测试这些实体及其关系是否正确地保存在数据库中。

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

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

    @Test
    public void persistingUser_ShouldWorkCorrectly() {
        // arrange
        User user = createUser();
    
        // act
        userDAO.save(user);
    
        // assert
        assertThat(user).hasName(...)
                        .livesInCity(...)
                        .livesInCountry(...);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-01
      • 1970-01-01
      • 2016-05-04
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      相关资源
      最近更新 更多