我正在尝试增加测试覆盖率,所以我想知道,您将如何测试 DAO 中抛出的 DataAccessExceptions,例如在一个简单的 findAll 方法中,该方法仅返回数据源中的所有数据?就我而言,我使用 Spring JdbcTemplates。
对于一般测试,我的 setUp 方法带有 @Before 注释,模拟使用的 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 块,除非检索数据时出现连接失败,这就是我想要测试的。
使用 Mockito,您可以模拟一个类以及该特定类的方法调用。当调用特定方法时,还可以要求模拟对象抛出异常。首先你必须模拟你的 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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)