Java, Spring : Testing DAOs for DataAccessException with Mockito

标签 java spring unit-testing jdbc

我正在尝试增加我的测试覆盖率,所以我想知道,您将如何测试在 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/

相关文章:

java - 移动二维数组中的对象

java - 在处理: InternalError: java. awt.geom.NoninvertibleTransformException时使用缩放功能时收到以下错误:行列式为0

java - 如何在 Java 中实现字符串格式化机制?

java - Android 测试 : Dialog. 检查是否正在显示()

unit-testing - 无法使用Visual Studio 2017 RC进行XUnit测试

java - 如何调用另一个项目的项目类?

java - Spring MVC 忽略给定 Controller 方法的 Json 属性

java - 从实际复制的 DuplicateKeyException 中检索特定的 MongoDB 键 (Java/Spring)

java - Spring 项目的容器

c++ - 动态选择类中私有(private)成员的类型