gpt4 book ai didi

Java, Spring : Testing DAOs for DataAccessException with Mockito

转载 作者:行者123 更新时间:2023-11-30 10:42:38 25 4
gpt4 key购买 nike

我正在尝试增加我的测试覆盖率,所以我想知道,您将如何测试在 DAO 中抛出的 DataAccessExceptions,例如在一个简单的 findAll 方法中,它只返回数据源中的所有数据?就我而言,我使用的是 Spring JdbcTemplates。

对于一般测试,我使用带有 @Before 注释的设置方法,模拟使用的 jdbcTemplate,在 DAO 中设置它并模拟所有 jdbc 调用。现在强制 DataAccessException 像 create 方法一样非常简单,只需在使用正确的主键调用 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 block ,除非在检索数据时出现连接失败,而这正是我想要测试的。

最佳答案

使用 Mockito,您可以模拟一个类和该特定类的方法调用。当在其上调用特定方法时,也可以要求模拟对象抛出异常。首先你必须模拟你的 jdbcTemplate,然后 stub 你的异常

   //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));

关于Java, Spring : Testing DAOs for DataAccessException with Mockito,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38040567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com