如何在JUnit中强制执行SQLException

如何在JUnit中强制执行SQLException,junit,mockito,sqlexception,Junit,Mockito,Sqlexception,我正在用JUnit编写单元测试,但未能成功覆盖捕获SQLException并返回null对象的特定方法的分支。 这是我正在测试的类: @Component public class UnitOfMeasureRowMapper implements RowMapper<UnitOfMeasure> { public UnitOfMeasure mapRow(final ResultSet resultSet, final int rowNumber) throws SQLEx

我正在用JUnit编写单元测试,但未能成功覆盖捕获SQLException并返回null对象的特定方法的分支。 这是我正在测试的类:

@Component
public class UnitOfMeasureRowMapper implements RowMapper<UnitOfMeasure> {
    public UnitOfMeasure mapRow(final ResultSet resultSet, final int rowNumber) throws SQLException {
        UnitOfMeasure unitOfMeasure = new UnitOfMeasure();
        try {
            unitOfMeasure.setUnitOfMeasureId(resultSet.getInt("UNITOFMEASUREID"));
            unitOfMeasure.setOwnerUserId(resultSet.getInt("USERID"));
            unitOfMeasure.setName(resultSet.getString("NAME"));
            unitOfMeasure.setDescription(resultSet.getString("DESCRIPTION"));
        } catch (SQLException e) {
            unitOfMeasure = null;
        }
        return unitOfMeasure;
    }
}

我认为问题在于最后一行;我需要强制执行SQLException。问题是,我不知道怎么做,也没有找到答案。有人能帮忙吗?

设置mock
ResultSet
的一个方法(可能是
getInt
?)来抛出异常。您没有指定正在使用的模拟框架,因此我无法告诉您确切的语法。

如果我理解这个问题,那么测试中的类是UnitOfMeasureRowMapper。如果这是真的,那么您不想在测试中模拟它,否则您就是在测试模拟! JUnit中正在测试的是UnitOfMeasureRowMapper#mapRow在方法执行期间抛出SQLException时的行为。然后您希望此方法返回null。 我会这样写:

private ResultSet mockResultSet;
private RowMapper<UnitOfMeasure> rowMapper = new UnitOfMeasureRowMapper();

public void setUp() throws Exception {
    mockResultSet = mock(ResultSet.class);
}
@Test
public void mapRow_SHOULD_return_null_WHEN_resultSet_throws_a_SQLException() {
    when(mockResultSet.getInt(anyString()).thenThrow(new SQLException());
    assertThat(mockRowMapper.mapRow(mockResultSet, 1), nullValue());
}
私有结果集mockResultSet;
私有行映射器行映射器=新的度量单位行映射器();
public void setUp()引发异常{
mockResultSet=mock(ResultSet.class);
}
@试验
public void mapRow\u在\u resultSet\u抛出\u SQLException()时应\u返回\u null\u{
when(mockResultSet.getInt(anyString()).thenthow(newsqlexception());
assertThat(mockRowMapper.mapRow(mockResultSet,1),nullValue());
}
正如Samuel在回答中所建议的,您可以设置用于抛出SQLException的结果集的方法之一,然后在JUnit中检查mapRow方法是否按预期返回null。这里您不是在测试结果集的行为,因此可以模拟它以实现在某些情况下通常具有的行为否则会很痛苦。模拟结果集行为可以让您专注于测试RowMapper行为


您正在测试实现RowMapper的UnitOfMeasureRowMapper。因此,您的JUnit中有一个RowMapper属性,我更喜欢通过它的接口查看它。我喜欢残酷地调用UnitOfMeasureRowMapper的构造函数,因为我想让我的JUnit尽可能简单。

@Samuel Edwin Ward和Alban:谢谢,很好的回答。我是using mockito,我应该说明这一点。此外,我一直在研究其他一些编码,但一直无法回到这一点。希望很快我会给你们两个回复,让你们知道什么是有效的。谢谢!事实证明,这段时间我只需要使用thenThrow。我一直在绞尽脑汁试图让它与thenRetu一起工作恩,谢谢!
private ResultSet mockResultSet;
private RowMapper<UnitOfMeasure> rowMapper = new UnitOfMeasureRowMapper();

public void setUp() throws Exception {
    mockResultSet = mock(ResultSet.class);
}
@Test
public void mapRow_SHOULD_return_null_WHEN_resultSet_throws_a_SQLException() {
    when(mockResultSet.getInt(anyString()).thenThrow(new SQLException());
    assertThat(mockRowMapper.mapRow(mockResultSet, 1), nullValue());
}