Java 在JUnit中获取当前Spring事务并提交它

Java 在JUnit中获取当前Spring事务并提交它,java,spring,jpa,junit,transactions,Java,Spring,Jpa,Junit,Transactions,可以在JUnit中获取当前的Spring事务吗 我想在DAO中测试JPA。和DAO没有事务。在测试中,spring为每个方法创建事务。我想在考试中的某个地方进行交易。需要它来测试数据库状态。我找到的唯一解决方案是为每个方法创建@Rule。您可以: 在测试中注入整个管理器 在调用DAO后调用flush() 使用此EntityManager测试数据库 最好在事务/回滚时保持spring的默认行为,以尽量减少测试之间的副作用您可以: 在测试中注入整个管理器 在调用DAO后调用flush() 使用

可以在JUnit中获取当前的Spring事务吗

我想在DAO中测试JPA。和DAO没有事务。在测试中,spring为每个方法创建事务。我想在考试中的某个地方进行交易。需要它来测试数据库状态。我找到的唯一解决方案是为每个方法创建@Rule。

您可以:

  • 在测试中注入整个管理器
  • 在调用DAO后调用flush()
  • 使用此EntityManager测试数据库
最好在事务/回滚时保持spring的默认行为,以尽量减少测试之间的副作用

您可以:

  • 在测试中注入整个管理器
  • 在调用DAO后调用flush()
  • 使用此EntityManager测试数据库

始终最好保持spring on transaction/rollback的默认行为,以最小化测试之间的副作用

您可以使用
TestTransaction
来管理spring测试事务:

TestTransaction.flagForCommit();
TestTransaction.end();

这将为
提交标记当前事务并结束它。之后,您可以使用
TestTransaction.start()
来启动新事务。

您可以使用
TestTransaction
来管理spring测试事务:

TestTransaction.flagForCommit();
TestTransaction.end();

这将为
提交标记当前事务并结束它。之后,您可以使用
TestTransaction.start()
启动新事务。

您不需要仅提交刷新。只需将实体管理器注入测试。。。执行
em.flush()
并检查所需内容。我尝试了,直到事务未提交,数据库才会更新。所以我不能用另一个连接检查数据库中的内容。或者我可以获取当前entityManager连接,并使用它检查数据库?当然,您不能使用其他连接,因为它仅对当前连接可见。使用相同的实体管理器(或者更好的是普通sql调用)检查结果。刷新后,执行
清除
并执行查询。不确定我是否理解正确。事务未提交,因此数据库中没有行。若我将使用相同的实体管理器,我将从orm中获得结果,即使表中并没有数据。是否正确?请再次阅读评论(以及ORMs是如何工作的)。因此,添加了清除一级缓存的
em.clear()
。您不需要仅提交刷新。只需将实体管理器注入测试。。。执行
em.flush()
并检查所需内容。我尝试了,直到事务未提交,数据库才会更新。所以我不能用另一个连接检查数据库中的内容。或者我可以获取当前entityManager连接,并使用它检查数据库?当然,您不能使用其他连接,因为它仅对当前连接可见。使用相同的实体管理器(或者更好的是普通sql调用)检查结果。刷新后,执行
清除
并执行查询。不确定我是否理解正确。事务未提交,因此数据库中没有行。若我将使用相同的实体管理器,我将从orm中获得结果,即使表中并没有数据。是否正确?请再次阅读评论(以及ORMs是如何工作的)。因此,添加的清理一级缓存的
em.clear()
看起来像是flush()没有提交,因为事务由spring测试上下文管理,它在等待提交?如果我保持默认的事务行为,测试DAO方法的最佳方法是什么?flush()将jpa缓存发送到db。事务未提交,但数据库已同步。尽管我使用了Spring数据存储库和AbstractTransactionalJUnit4SpringContextTests方法进行检查,但是您可以使用相同的EntityManager(即相同的连接/相同的tx)测试db。flush()在事务结束之前不会提交到数据库。在Junit情况下,当前线程确实接收更新的刷新对象,但其他线程接收旧对象,因为事务未提交。仍在尝试解决问题。看起来flush()没有提交,因为事务由spring测试上下文管理,它正在等待提交?如果我保持默认的事务行为,测试DAO方法的最佳方法是什么?flush()将jpa缓存发送到db。事务未提交,但数据库已同步。尽管我使用了Spring数据存储库和AbstractTransactionalJUnit4SpringContextTests方法进行检查,但是您可以使用相同的EntityManager(即相同的连接/相同的tx)测试db。flush()在事务结束之前不会提交到数据库。在Junit情况下,当前线程确实接收更新的刷新对象,但其他线程接收旧对象,因为事务未提交。仍在尝试解决此问题。添加了
TestTransaction.flagForCommit()
@TestExecutionListeners
。尽管如此,实体并没有被提交到数据库中,这一做法效果良好。直到事务结束,flush()才提交到数据库。在Junit情况下,当前线程确实接收更新的刷新对象,但其他线程接收旧对象,因为事务未提交。但是使用TestTransaction可以测试JUnit中的多线程代码。谢谢。添加了
TestTransaction.flagForCommit()
@TestExecutionListeners
。尽管如此,实体并没有被提交到数据库中,这一做法效果良好。直到事务结束,flush()才提交到数据库。在Junit情况下,当前线程确实接收更新的刷新对象,但其他线程接收旧对象,因为事务未提交。但是使用TestTransaction可以测试JUnit中的多线程代码。谢谢