【发布时间】:2011-11-27 05:07:46
【问题描述】:
我正在测试 JdbcSpitterDao#getSpitterByid() 并在嘲笑 jdbcTemplate.queryForObject()
public class JdbcSpitterDao extends JdbcDaoSupport implements SpitterDao {
...
public Spitter getSpitterById(long id,
ParameterizedRowMapper<Spitter> parameterizedRowMapper) {
JdbcTemplate jdbcTemplate = getJdbcTemplate();
return jdbcTemplate.queryForObject(SQL_SELECT_SPITTER,
parameterizedRowMapper, id);
}
...
}
我的测试对象包含以下内容
ParameterizedRowMapper<Spitter> parameterizedRowMapper = new ParameterizedRowMapper<Spitter>() {
public Spitter mapRow(ResultSet rs, int rowNum) throws SQLException {
Spitter Spitter = new Spitter();
spitter.setId(rs.getLong(1));
spitter.setUsername(rs.getString(2));
spitter.setPassword(rs.getString(3));
spitter.setFullName(rs.getString(4));
spitter.setEmail(rs.getString(5));
return spitter;
}
};
JdbcTemplate jdbcTemplate = mock(JdbcTemplate.class);
JdbcSpitterDao jdbcSpitterDao = new JdbcSpitterDao();
jdbcSpitterDao.setJdbcTemplate(jdbcTemplate);
// Don't connect to the database. Mock JdbcTemplate class
when(
jdbcTemplate.queryForObject(
JdbcSpitterDao.SQL_SELECT_SPITTER,
parameterizedRowMapper, 1)).thenReturn(new Spitter(1, "rajkumarm", "rajmukarm",
"Rajkumar Masaniayan", "rajkumarm@gmail.com"));
// Actual test
Spitter actualSpitter = jdbcSpitterDao.getSpitterById(1, parameterizedRowMapper);
但是when().thenReturn() idiom 没有被调用。控制流向实际的jdbcTemplate。好像有问题
JdbcTemplate jdbcTemplate = mock(JdbcTemplate.class);
或
jdbcSpitterDao.setJdbcTemplate(jdbcTemplate);
请告诉我出了什么问题?
【问题讨论】:
-
我不明白,一半的代码使用
JdbcSpitterDao,一半使用JdbcTwitterDao。这只是一个真正持久的错字,还是你有不同的类型?如果它们是不同的类,那肯定会导致您看到的问题。 -
:-)。这确实是持久的错字。在 Stackoverflow 中手动更改名称类型
-
你是否在最后添加了一个断言来检查结果?
-
显然 mockito 对匿名对象有问题。它期望在实际函数调用中使用的对象也被提供给 when().thenReturn() 习惯用法。我通过为 parameterizedRowMapper
接口创建一个 Impl 类并在这两个地方使用相同的函数来完成这项工作。 -
您应该将此添加为答案,然后接受它。以便其他人可以从答案中受益。