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
我正在尝试在 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