2

我正在使用 Spring 和 JUnit 为我的 DAO 编写一些集成测试。我在测试方法的开始设置我的测试数据,然后在同一个测试方法中测试我的 DAO 方法。问题是,如果我不刷新/提交事务,EntityManager 会返回我刚刚在数据设置中创建的实体的相同实例 - 使我的测试无用,因为它们总是会通过。

例如

@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。

4

1 回答 1

2

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

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

于 2012-04-15T15:16:44.497 回答