在单元测试期间提交/刷新交易?

时间:2012-04-12 15:17:40

标签: spring unit-testing transactions junit4

我正在使用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。

1 个答案:

答案 0 :(得分:2)

您可以在@Transactional上设置defaultRollback属性,以便在测试之间重置内容。这听起来不像你要求的那样,只是把它扔到那里。

在测试中,实体管理器表现正常。您希望为测试注入不同的行为,以便将设置与其余测试“断开连接”。我在一些测试中做的一件事是直接从测试中调用实体管理器上的flush。我只需要做几次,但在这些情况下它很有价值。我在测试中做到了(不是DAO),以便不在DAO上提供我不希望人们调用的方法。