Spring 为什么mockito';s when().thenReturn()不工作?
我正在测试Spring 为什么mockito';s when().thenReturn()不工作?,spring,junit,mockito,Spring,Junit,Mockito,我正在测试JdbcSpitterDao#getSpitterByid()并模拟jdbcTemplate.queryForObject() 或 您能告诉我出了什么问题吗?有一个建议,不要嘲笑您不拥有的类型。一般来说,这是一个很好的建议,在这里完全不进行dao的单元测试是有意义的。为什么不只是集成测试在DB上运行且没有附加逻辑的sth?我不明白,一半的代码使用JdbcSpitterDao,另一半使用JdbcTwitterDao。这只是一个持续的打字错误,还是你有不同的类型?如果它们是不同的类,这肯定
JdbcSpitterDao#getSpitterByid()
并模拟jdbcTemplate.queryForObject()
或
您能告诉我出了什么问题吗?有一个建议,不要嘲笑您不拥有的类型。一般来说,这是一个很好的建议,在这里完全不进行dao的单元测试是有意义的。为什么不只是集成测试在DB上运行且没有附加逻辑的sth?我不明白,一半的代码使用
JdbcSpitterDao
,另一半使用JdbcTwitterDao
。这只是一个持续的打字错误,还是你有不同的类型?如果它们是不同的类,这肯定会导致您看到的问题。:-。这确实是一个持续的打字错误。是否在StackOverflow中手动更改名称类型?是否在末尾添加了断言以检查结果?显然,mockito在匿名对象方面存在问题。它希望实际函数调用中使用的对象也能提供给when().thenReturn()习惯用法。我通过为parameterizedRowMapper接口创建一个Impl类并在这两个地方使用相同的函数实现了这一点。这样其他人就可以从答案中受益。
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);
JdbcTemplate jdbcTemplate = mock(JdbcTemplate.class);
jdbcSpitterDao.setJdbcTemplate(jdbcTemplate);