方法countryDao.delete(countryEntity)应该抛出ConstraintViolationException,只有在抛出异常时才应该通过测试。
但是,下面表单中的测试没有通过,我收到消息" java.lang.AssertionError:抛出org.hibernate.exception.ConstraintViolationException实例的预期测试"
@Test
public void testDeleteWithCities() throws Exception {
exception.expect(ConstraintViolationException.class);
CountryEntity countryEntity = countryDao.find(1L);
countryDao.delete(countryEntity);
}
在我将最后一行添加到测试后,它确实通过了:
@Test
public void testDeleteWithCities() throws Exception {
exception.expect(ConstraintViolationException.class);
CountryEntity countryEntity = countryDao.find(1L);
countryDao.delete(countryEntity);
Assert.assertEquals(3, countryDao.findAll().size());
}
它应该像这样吗?我相信不应该需要Assert.assertEquals(3, countryDao.findAll().size());
。
感谢您的帮助。
答案 0 :(得分:1)
我的猜测是你的测试是交易性的。因此DAO.delete()
方法在用于测试方法的事务中完成。
delete()
或remove()
不会立即删除该实体,就像persist()
没有立即插入实体一样。它只是将实体标记为已删除,并且在下一次刷新时,Hibernate将执行删除查询。
调用findAll()
时,您会隐瞒地刷新Hibernate会话(以确保findAll()
不会返回先前删除的实体)。因此,此时执行删除查询,这会导致ConstraintViolationException
。
您可以通过启用SQL日志记录,逐行执行代码以及检查每个步骤生成的SQL查询来确认。
因此,要么不进行测试交易,要么在测试中明确地调用flush()
(这使得意图比调用findAll()
更清晰。)