Mockito 中用于 jdbcTemplate 查询的 ClassCastException

ClassCastException in Mockito for jdbcTemplate query

我正在尝试在 Spring 项目中测试 class。我有以下方法

public List<Range> getRanges() {
    return getJdbcTemplate().query(RANGE_SQL, new RangeMapper());
}

public List<Score> getScores() {
    return getJdbcTemplate().query(SCORE_SQL, new ScoreMapper());
}

public Map<String, Object> getData() {
    //other code
    final List<Range> ranges = getRanges();
    final List<Score> scores = getScores();
}

getData()-

的测试用例中
when(jdbcTemplate.query(any(String.class), any(RangeMapper.class))).thenReturn(rangeList);
when(jdbcTemplate.query(any(String.class), any(ScoreMapper.class))).thenReturn(scoresList);

当我 运行 测试 getData 时,它失败了 ClassCastException 声明 "Score cannot be cast to Range"。当我调试时看到,getData() 中的 getRanges() 正在返回 scoresList。为什么会出现这种情况,如何解决?

我建议改为模拟 getRanges()getScores() 方法。

when(theClass.getScores()).thenReturn(scoresList);
when(theClass.getRanges()).thenReturn(rangesList);

如果您需要按照自己的方式进行操作,您应该指定字符串以获得正确的结果:

when(jdbcTemplate.query(SCORE_SQL, any(ScoreMapper.class))).thenReturn(scoresList);
when(jdbcTemplate.query(RANGE_SQL, any(RangeMapper.class))).thenReturn(rangesList);

规范any(String.class)是这里的突破点。在你的情况下,你遇到了你没有指定的问题,在这种情况下它 return 是正确的。

所以如果你指定给定的 String 它应该 return 正确 List