Java,Spring:使用Mockito测试DataAccessException的DAO

时间:2016-06-26 16:19:33

标签: java spring unit-testing jdbc

我正在尝试增加我的测试覆盖率,所以我想知道,你将如何测试在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块,除非在检索数据时出现连接失败,这就是我想要测试的内容。

1 个答案:

答案 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));