我正在使用Spring和JUnit为我的DAO编写一些集成测试。我在测试方法的开头设置我的测试数据,然后在同一测试方法中测试我的DAO方法。问题是,如果我不刷新/提交事务,EntityManager返回我刚刚在我的数据设置中创建的实体的相同实例 - 使我的测试无用,因为它们将始终通过。
E.g。
@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));
}
一种方法是在我的DAO中公开commit()和/或flush()方法。但我宁愿不这样做,因为在生产代码中,这几乎不需要发生(让EntityManager做它的事情)。有没有办法通过注释或Spring配置来配置它?我正在使用Spring,JPA2和Hibernate。
答案 0 :(得分:2)
您可以在@Transactional上设置defaultRollback属性,以便在测试之间重置内容。这听起来不像你要求的那样,只是把它扔到那里。
在测试中,实体管理器表现正常。您希望为测试注入不同的行为,以便将设置与其余测试“断开连接”。我在一些测试中做的一件事是直接从测试中调用实体管理器上的flush。我只需要做几次,但在这些情况下它很有价值。我在测试中做到了(不是DAO),以便不在DAO上提供我不希望人们调用的方法。