【问题标题】:Spring Database Integration Test, when to flush or?Spring 数据库集成测试,何时刷新或?
【发布时间】:2012-11-08 17:37:19
【问题描述】:

我对 Spring 还很陌生,正在做一些集成测试。 使用 Hibernate、MySql 和 Spring 数据 JPA。 我正在使用事务支持,每次测试结束时一切都会回滚。

例如:

@Test (expected=DataIntegrityViolationException.class)
public void findAndDelete() {
    UUID uuid = UUID.fromString(TESTID);
    User user= iUserService.findOne(uuid);
    iUserService.delete(cashBox);

    iUserService.flush();                

    assertNull(iUserService.findOne(uuid));
}

在上面的代码中,我调用了 iUserService.flush(),以便将 sql 发送到 DB,并发生预期的 DataIntegrityViolationException,因为存在从 User 到另一个表的外键(不允许级联,无)。到目前为止一切顺利。

现在,如果我删除 iUserService.flush() 那么预期的异常不会发生,因为 sql 没有被发送到数据库。

我尝试将 flush() 添加到拆卸 @After 方法中,但这不起作用,因为测试没有看到测试方法之外的异常。

有什么方法可以避免在测试方法中调用刷新?

如果我团队中的开发人员根本不必在他们的测试代码中使用 flush 方法会更好

编辑: 我尝试添加以下内容

    @Before
public void before() {
    Session session = entityManagerFactory.createEntityManager().unwrap(Session.class);
    session.setFlushMode(FlushMode.ALWAYS);

}

但它似乎确实在每次查询之前刷新了 sql。

【问题讨论】:

    标签: spring hibernate integration-testing


    【解决方案1】:

    以我的拙见,这比你团队的开发人员知道他们在做什么要好。

    它包括默认配置的内容及其后果。

    请看看你为什么需要avoid false positives when testing ORM code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2019-04-12
      • 2018-03-22
      相关资源
      最近更新 更多