只有在调用Assert之后,JUnit测试才会捕获异常

时间:2014-04-16 20:35:18

标签: java junit

方法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());

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我的猜测是你的测试是交易性的。因此DAO.delete()方法在用于测试方法的事务中完成。

delete()remove()不会立即删除该实体,就像persist()没有立即插入实体一样。它只是将实体标记为已删除,并且在下一次刷新时,Hibernate将执行删除查询。

调用findAll()时,您会隐瞒地刷新Hibernate会话(以确保findAll()不会返回先前删除的实体)。因此,此时执行删除查询,这会导致ConstraintViolationException

您可以通过启用SQL日志记录,逐行执行代码以及检查每个步骤生成的SQL查询来确认。

因此,要么不进行测试交易,要么在测试中明确地调用flush()(这使得意图比调用findAll()更清晰。)