重复对象保存时JPA DAO集成测试不抛出异常?

时间:2010-06-14 16:10:07

标签: hibernate spring jpa junit persistence

我正在使用Spring / JPA和Hibernate作为提供程序构建DAO的单元测试过程。

在运行测试之前,DBUnit插入了一个用户名为“poweruser”的用户记录 - 用户名是users表中的主键。这是集成测试方法:

@Test
@ExpectedException(EntityExistsException.class)
public void save_UserTestDataSaveUserWithPreExistingId_EntityExistsException() {
    User newUser = new UserImpl("poweruser");

    newUser.setEmail("kuser@null.com");
    newUser.setFirstName("New");
    newUser.setLastName("User");
    newUser.setPassword("secret");

    dao.persist(newUser);
}

我已经验证该记录是在此方法开头的数据库中。不确定这是否相关,但如果我在此方法结束时执行dao.flush(),则会出现以下异常:

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: 
    Could not execute JDBC batch update

2 个答案:

答案 0 :(得分:1)

显然除非显式或隐式调用flush(通过查询或提交),否则不会抛出任何潜在的异常。所以我想我将不得不在所有修改数据的集成测试中调用flush()。

答案 1 :(得分:1)

我假设您正在使用事务集成测试?这些测试在每个测试方法结束时回滚,因此您确实错过了刷新。

我不知道这是否有用,但是如果你是自动生成ID,那么在persist()上会发生刷新,因为需要访问数据库来获取生成的ID。但是,如果您要分配自己的ID,那么刷新会延迟到提交,如您所见。