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);