【问题标题】:JUnit: how to test method which deletes entity (JPA)JUnit:如何测试删除实体的方法(JPA)
【发布时间】:2019-07-27 20:44:31
【问题描述】:

我有简单的 crud 存储库:

public interface BookRepository extends CrudRepository<Book, Long> {
    @Modifying
    @Transactional
    void deleteById(Long id);
}

如何编写简单的 JUnit 测试来检查此方法是否正常工作?当然,在这种情况下,我有实体Book

【问题讨论】:

  • 如果您使用的是 springboot,您可以使用 DataJpaTest 注解来运行嵌入式 h2 数据库并测试您的存储库。但如下所述,您不必测试 spring 数据库,它应该可以正常工作:)

标签: java hibernate jpa spring-data-jpa spring-data


【解决方案1】:

你不应该。

对 Spring Data 存储库进行单元测试是 Spring Data 开发人员的问题 - 作为开发人员,您正在使用他们的 API,它应该可以正常工作。关心你的逻辑而不是库 - 专注于集成测试

无论如何,如果你真的想这样做 - 我会做的是模拟 EntityManager 并以某种方式将其注入 Repository 实现(听起来像可怕的任务),或者我会使用 DBUnit 测试,准备测试数据并简单地检查对象是否被删除(这是首选方式)

【讨论】:

    【解决方案2】:

    通常 Spring Data 存储库不测试,但如果你真的想测试它,你可以使用 @DataJpaTest 并注入 TestEntityManager

    例子:

    @DataJpaTest
    class BookRepositoryTest {
    
        @Autowired
        private BookRepository repository;
    
        @Autowired
        private TestEntityManager em;
    
        @Test
        void deleteById() {
            Book book = ...;
            final Long id = em.persistAndGetId(book, Long.class);
            repository.deleteById(id);
            em.flush();
            Book after = em.find(Book.class, id);
            assertThat(after).isNull();
        }
    }
    

    想法是您使用TestEntityManager 来排除您的所有操作。在示例中,您通过TestEntityManager 持久化并查找实体,但通过您的自定义存储库删除。

    【讨论】:

      猜你喜欢
      • 2016-10-31
      • 2022-01-23
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      相关资源
      最近更新 更多