如何在 DAO 层抛出 SQLException

How to throw SQLException in a DAO-layer

我想用 JUnit 测试 DAO class。测试覆盖率为 80%,因此除了 SQLException 的 catch 子句外,几乎每一行代码都被覆盖了。我不知道如何引发 SQLException

 public void removeStudentFromCourse(Integer studentId, Integer courseId) {
        try (Connection connection = connector.getConnection();
             PreparedStatement statement = connection.prepareStatement(
                     DELETE_STUDENT_FROM_ONE_COURSE_QUERY)) {
            statement.setInt(1, studentId);
            statement.setInt(2, courseId);
            statement.executeUpdate();
        } catch (SQLException e) {
            throw new DBException("Can`t remove student with id: " + studentId +
                    " from course with id:" + courseId, e);
        }
    }

那你要作弊的地方:

  • 你的连接器对象(不管它是什么)是模拟的吗
  • 模拟 returns 模拟 Connection
  • 嘲笑 Connection returns 嘲笑 PreparedStatement
  • 通过抛出 SQLException.
  • 让模拟的 PreparedStatement 失败

对于 mockito,这可能是:

// case 1
when(connector.getConnection()).thenThrow(SQLException.class); 
// case 2
Connection cnx = mock(Connection.class);
when(cnx.prepareStatement(anyString()).thenThrow(SQLException.class); 
when(connector.getConnection()).thenReturn(cnx);
when(connector.getConnection()).thenThrow(SQLException.class); 

你可以

  • 有一个连接在调用 getConnection()
  • 时抛出 SQLException
  • 有一个生成模拟 PreparedStatement 的连接,它会在调用的方法之一上抛出 SqlException,例如 setInt()executeUpdate(),或
  • DELETE_STUDENT_FROM_ONE_COURSE_QUERY 覆盖为无效的 SQL 语句。