【问题标题】:Commit/Flush transactions during unit test?在单元测试期间提交/刷新事务?
【发布时间】:2012-04-12 15:17:39
【问题描述】:

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

【问题讨论】:

    标签: spring unit-testing transactions junit4


    【解决方案1】:

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

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

    【讨论】:

    • 当然,谢谢你的提醒。我已经习惯了通过 DAO 使用实体管理器,以至于我忘记了我可以简单地将它连接到我的测试中以直接调用它。 :)