【问题标题】:Spring JPA dababase trigger JUnit testingSpring JPA 数据库触发 JUnit 测试
【发布时间】:2018-07-17 08:26:56
【问题描述】:

我的案例:Postgresql 数据库,一个“支出”表,一个带有“total_spendings”列的“用户”表。我在 'spendings' 表上有一个触发器,它更新了 'total_spendings' 列。

我使用 Spring JPA,并且我的测试使用注释

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@Rollback

在“支出”表中插入后,我不知道如何检索“总支出”列的新值。我重新加载了 User 实体,它显示了旧值。

如果我删除@Transactional 和@Rollback,它会按预期工作,但我必须在测试后清理数据。

如何在@Rollback 单元测试事务中执行此操作?

谢谢

【问题讨论】:

  • 您可以在测试类的EntityManager 上调用flush()

标签: junit spring-data rollback transactional database-trigger


【解决方案1】:

正如 Davidxxx 所说,您必须执行 flush() 以强制 JPA 执行 SQL 语句,这将执行触发器。

// Inject the EnitityManager in your test class
@PersistenceContext
private EntityManager em;


// Force JPA to execute the SQL statements
em.flush();

【讨论】:

  • 谢谢你的回答,也谢谢@davidxxx。在我这样做之后,我可以在日志中看到插入语句被刷新。触发器运行,我通过有目的地在触发器函数中插入错误进行测试。但是,新请求的用户与我在插入之前已经加载的用户是同一个实例。我知道这是因为调试器显示了相同的 User@11156。所以我添加了 entityManager.refresh(user) 并且一切正常
  • 如果你有更多的对象需要刷新并且想要更强大的解决方案,而不是刷新每个实体,调用entityManager.clear() 来清除整个持久性上下文可能会很方便(只要记住这样做 之后调用flush())。
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2011-04-22
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多