【问题标题】:SpringBoot, JPA and Hibernate Unit-Test for Entities layer实体层的 SpringBoot、JPA 和 Hibernate 单元测试
【发布时间】:2021-03-18 22:14:56
【问题描述】:

我正在使用 SpringBoot、JPA 和 Hibernate 实现一个项目。

我使用 JPA 存储库实现了 DB 实体层。

我有兴趣了解为这一层编写单元测试的最佳实践。

  • 第一点:对于这一层,从您的角度来看,有必要使用集成数据库还是有必要使用 Mockito 等进行模拟?
  • 我的想法,对于这一层,例如,测试实体结构:例如检查字段验证,插入和检索一些数据。通过这种方式,我想我可以覆盖整个数据层的测试。

我正在尝试了解这些最佳实践,同时,我尝试编写第一个测试示例:

@ActiveProfiles("test")
@DisplayName("Test Item JPA Entity")
@DataJpaTest
@AutoConfigureTestDatabase( replace = AutoConfigureTestDatabase.Replace.NONE )
public class ItemEntityTest {

    @Autowired
    MyEntityRepository repo;

    @Test
    @Transactional
    public void testEntityCreation() {

        Entity e = new Entity();
        e.setMyField1("A");
        e.setMyField1("A");
        //e.setMandatoryField("C")

        repo.save(e);

    }
}

不幸的是,在这种情况下,我注意到没有应用字段验证(@NotNull 或 @NotEmpty,或 @Column(nullable=false) 等...如果我尝试将实体保存到我的应用程序中,则验证工作正常...引发异常)。为什么?

还有一些“自动字段”(例如创建时间和最后修改时间)没有填写。

这是正确的路径吗?何来测试我的实体定义?

【问题讨论】:

  • 我认为问题出在测试实体管理器的刷新上,请查看answer
  • 我正在使用 JPA 存储库,我还需要在我的测试中使用它

标签: java spring-boot hibernate unit-testing jpa


【解决方案1】:

正如那个答案中提到的,问题在于 @DataJpaTest spring 将使用 TestEntityManager 并且事务注释将覆盖 spring boot 的默认自动提交和回滚行为。

因此您的测试方法将通过并假设 hibernate 是此处使用的 ORM,当最终进行刷新时,将触发 hibernate 的 pre-insert 事件并应用验证,但您的测试用例将在此之前通过它会产生误报(如 spring 文档中使用的术语)

解决方案:您需要在测试中注入实体管理器并手动刷新它,以便在测试完成之前触发休眠预插入事件。

@ActiveProfiles("test")
@DisplayName("Test Item JPA Entity")
@DataJpaTest
@AutoConfigureTestDatabase( replace = AutoConfigureTestDatabase.Replace.NONE )
public class ItemEntityTest {

    @Autowired
    MyEntityRepository repo;

    @Autowired
    private TestEntityManager em;

    @Test
    @Transactional
    public void testEntityCreation() {

        Entity e = new Entity();
        e.setMyField1("A");
        e.setMyField1("A");
        //e.setMandatoryField("C")

        repo.save(e);
        
        em.flush();
    }
}

这必须触发您对所应用实体的验证,这在spring framework docs 中有记录。 请注意,文档是关于 spring 框架并使用会话工厂,但概念是相同的

您也可以查看spring boot docs,它指向此行为的 spring 框架文档。

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2010-10-31
    • 2017-07-22
    相关资源
    最近更新 更多