如何在 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 语句。
我想用 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()
时抛出 - 有一个生成模拟 PreparedStatement 的连接,它会在调用的方法之一上抛出
SqlException
,例如setInt()
或executeUpdate()
,或 - 将
DELETE_STUDENT_FROM_ONE_COURSE_QUERY
覆盖为无效的 SQL 语句。
SQLException