我正在使用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
答案 0 :(得分:1)
显然除非显式或隐式调用flush(通过查询或提交),否则不会抛出任何潜在的异常。所以我想我将不得不在所有修改数据的集成测试中调用flush()。
答案 1 :(得分:1)
我假设您正在使用事务集成测试?这些测试在每个测试方法结束时回滚,因此您确实错过了刷新。
我不知道这是否有用,但是如果你是自动生成ID,那么在persist()上会发生刷新,因为需要访问数据库来获取生成的ID。但是,如果您要分配自己的ID,那么刷新会延迟到提交,如您所见。