JPA - 如何在单元测试之间截断表

The*_*heo 13 dbunit unit-testing jpa jpa-2.0

我希望在每个测试用例之后清理数据库而不回滚事务.我已经尝试过DBUnit的DatabaseOperation.DELETE_ALL,但如果删除违反了外键约束,它就不起作用.我知道我可以禁用外键检查,但这也会禁用对测试的检查(我想阻止).

我正在使用JUnit 4,JPA 2.0(Eclipselink)和Derby的内存数据库.有任何想法吗?

谢谢,西奥

Chr*_*haw 18

最简单的方法是使用nativeQuery jpa方法.

@After
public void cleanup() {
    EntityManager em = entityManagerFactory.createEntityManager();
    em.getTransaction().begin();
    em.createNativeQuery("truncate table person").executeUpdate();
    em.createNativeQuery("truncate table preferences").executeUpdate();
    em.getTransaction().commit();
}
Run Code Online (Sandbox Code Playgroud)

  • 我同意,但createNativeQuery需要一个事务.否则它会抛出异常.至少在休眠方面就是这种情况. (3认同)

Aar*_*lla 5

简单:在每次测试之前,启动一个新事务,在测试之后,回滚它。这将为您提供与以前相同的数据库。

确保测试不会创建新交易;而是重用现有的。

  • 是的,但是那样的话,您将无法捕获在事务提交期间发生的任何错误(例如,如果您测试关系等)。 (4认同)
  • 提交只是关闭事务并使数据库中的数据永久。如果你有 FK 错误,你会在 *flush* 会话时得到这些错误。无需提交。 (4认同)