我正在尝试增加我的测试覆盖率,所以我想知道,你将如何测试在DAO中抛出的DataAccessExceptions,例如在一个简单的findAll方法中,它只返回数据源中的所有数据?就我而言,我正在使用Spring JdbcTemplates。
对于一般测试,我有一个带有@Before注释的setUp-method,模拟使用的jdbcTemplate,在DAO中设置它并模拟所有jdbc调用。现在强制类似create方法的DataAccessException非常简单,只需在使用正确的主键调用create语句时抛出异常。
但是,我真的不知道如何处理这种方法,比如简单的findAll方法,它们不接受任何输入参数。测试有效的实现是直截了当的,但是如果不影响其他测试或方法,你会如何模拟没有数据库连接呢?
这将是我想测试的方法的具体实现:
public List<SomeObject> findAll() throws PersistenceException {
final String sql = "SELECT * FROM SomeObject";
try {
return jdbcTemplate.query(sql, new JdbcSomeObjectMapper());
} catch (DataAccessException ex) {
LOG.error(ex.getMessage());
throw new PersistenceException(ex.getMessage());
}
}
这将返回数据源中的所有对象。测试一个有效的调用是很容易的,因为我可以模拟jdbcTemplate.query调用,但我永远不会进入catch块,除非在检索数据时出现连接失败,这就是我想要测试的内容。
答案 0 :(得分:1)
使用Mockito,您可以模拟一个Class以及该特定类的方法调用。当调用特定方法时,也可以要求模拟对象抛出异常。首先,你必须模拟你的jdbcTemplate,然后存根你的异常
//mocking JdbcTemplate
JdbcTemplate template = Mockito.mock(JdbcTemplate.class);
Mockito.when(template.query(Mockito.anyString(), (RowMapper<YourClass>) Mockito.any(RowMapper.class))).thenThrow(EmptyResultDataAccessException.class);
//or using EasyMock
EasyMock.expect(template.query(Mockito.anyString(), (RowMapper<YourClass>) Mockito.any(RowMapper.class))).andThrow(new (typeofExecption));