gpt4 book ai didi

junit - 如何在 JUnit 中强制 SQLException

转载 作者:行者123 更新时间:2023-12-01 01:14:54 26 4
gpt4 key购买 nike

我正在 JUnit 中编写单元测试,但无法成功覆盖捕获 SQLException 并返回空对象的特定方法的分支。
这是我正在测试的类(class):

@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;
}
}

这是我为覆盖上述方法的第二个分支而编写的 JUnit 测试(具有来自测试类的适当上下文):
private static UnitOfMeasure testUnitOfMeasure;
private static UnitOfMeasureRowMapper mockRowMapper;

public void setUp() throws Exception {
mockRowMapper = mock(UnitOfMeasureRowMapper.class);
mockResultSet = mock(ResultSet.class);
}
@Test(expected=SQLException.class)
public void testUnitOfMeasureRowMapperFailsSQLException() throws SQLException {

when(mockRowMapper.mapRow(mockResultSet, 1)).thenReturn(null);
testUnitOfMeasure = mockRowMapper.mapRow(mockResultSet, 1);
}

我认为问题出在最后一行;不知何故,我需要强制一个 SQLException。问题是,我不知道如何也无法找到答案。任何人都可以帮忙吗?

最佳答案

如果我很好地理解了这个问题,那么被测类是 UnitOfMeasureRowMapper。如果这是真的,那么你不想在你的测试中模拟它,否则你正在测试一个模拟!
在您的 JUnit 中正在测试的是 UnitOfMeasureRowMapper#mapRow 的行为,当您给它的 ResultSet 在方法执行期间抛出 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());
}

正如 Samuel 在他的回答中所建议的那样,您可以设置用于抛出 SQLException 的结果集方法之一,然后在您的 JUnit 中检查 mapRow 方法是否按预期返回 null。在这里,您不是在测试结果集的行为,因此可以模拟它以实现在某些情况下通常会具有的行为,否则会很痛苦。模拟结果集行为可以让您专注于测试 RowMapper 行为。

您正在测试实现 RowMapper 的 UnitOfMeasureRowMapper。所以在你的 JUnit 中有一个 rowMapper 属性,我更喜欢通过它的界面来查看它。我喜欢粗暴地调用 UnitOfMeasureRowMapper 的构造函数,因为我想让我的 JUnit 尽可能简单。

关于junit - 如何在 JUnit 中强制 SQLException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12649020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com