【问题标题】:Spring Data JPA Repository CRUD TestingSpring Data JPA 存储库 CRUD 测试
【发布时间】:2014-07-16 13:10:12
【问题描述】:

我正在使用 Spring Data Repository,并且有一个关于编写 CRUD 测试的问题。我已经针对 Hibernate DAO 和 EJB 3 实体 bean 编写了许多 CRUD 测试,我在其中创建和实体,将其刷新到数据库,清除实体管理器,并通过 ID 读取它。实体管理器被清除,因此一级缓存不会在读取时命中。

使用 Spring Data 存储库,我找不到清除测试使用的底层实体管理器的方法,因此我的读取不会返回到实际数据库,从而使我的测试无效。

有什么办法可以清除测试中的实体管理器吗?有没有办法可以将一个注入到我的测试中,以便存储库使用它?

谢谢!

科里。

【问题讨论】:

  • 为什么您认为您需要与EntityManager 互动?您不想简单地为每个测试方法创建一个事务并在方法完成后回滚那个事务吗? Spring 测试框架开箱即用。查看示例here
  • 创建实体并刷新它后,我想清除 EntityManager,因此我知道读取实际上会在数据库上执行选择,而不仅仅是找到我刚刚从一级缓存创建的实体。
  • 如果你打开 SQL 日志记录,你应该能够确认数据库是从读取中选择的。

标签: spring-data-jpa


【解决方案1】:

像这样注入 entitymanager 试试:

@PersistenceContext
EntityManager entityManager

并通过在您的测试方法上设置@Transactional 属性来使您的测试具有事务性。然后在方法内部可以调用 entityManager.flush() 方法。

问候

【讨论】:

    【解决方案2】:

    如果您希望 EntityManager 自动清除,您可以将 @Modifying 注解的 clearAutomatically 属性设置为 true。 Please see here

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2018-08-06
      • 2014-08-13
      • 2014-06-19
      • 2016-12-26
      相关资源
      最近更新 更多