Spring 在单元测试期间提交/刷新事务?
我正在使用Spring和JUnit为我的DAO编写一些集成测试。我在测试方法开始时设置了测试数据,然后在相同的测试方法中测试我的DAO方法。问题是,如果我不刷新/提交事务,EntityManager将返回我在数据设置中刚刚创建的实体的同一个实例,这使得我的测试毫无用处,因为它们总是会通过 例如Spring 在单元测试期间提交/刷新事务?,spring,unit-testing,transactions,junit4,Spring,Unit Testing,Transactions,Junit4,我正在使用Spring和JUnit为我的DAO编写一些集成测试。我在测试方法开始时设置了测试数据,然后在相同的测试方法中测试我的DAO方法。问题是,如果我不刷新/提交事务,EntityManager将返回我在数据设置中刚刚创建的实体的同一个实例,这使得我的测试毫无用处,因为它们总是会通过 例如 一种方法是在我的DAO中公开commit()和/或flush()方法。但我宁愿不这样做,因为在生产代码中,这几乎不需要发生(让EntityManager做它自己的事情)。有没有办法通过注解或Spring配
一种方法是在我的DAO中公开commit()和/或flush()方法。但我宁愿不这样做,因为在生产代码中,这几乎不需要发生(让EntityManager做它自己的事情)。有没有办法通过注解或Spring配置来配置它?我将Spring、JPA2与Hibernate一起使用。您可以在@Transactional上设置defaultRollback属性来重置测试之间的内容。这听起来不像你想要的,只是先把它扔出去
在测试中,实体管理器的行为正常。您希望为测试注入不同的行为,以“断开”安装程序与测试其余部分的连接。我在一些测试中做的一件事是直接从测试调用实体管理器上的flush。我只需要做几次,但在那些情况下它是有价值的。我在测试中(不是DAO)这样做是为了不在DAO上提供我不想让人们调用的方法。当然,谢谢你提醒我。我太习惯通过DAO使用实体管理器了,以至于我忘了我可以直接将它连接到测试中调用它。:)
@Test
@Transactional()
public void loadTreeBasicCase() {
// creates and saved node to DB
Node n = createNode();
// test DAO
Node result = dao.lookup(n.getId());
// verify
assertThat(n, equalTo(result));
}