2011-11-27 474 views
1

我测试JdbcSpitterDao#getSpitterByid()和我嘲笑jdbcTemplate.queryForObject()为什么mockito的when()。thenReturn()不工作?

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", "[email protected]")); 

    // Actual test 
    Spitter actualSpitter = jdbcSpitterDao.getSpitterById(1, parameterizedRowMapper); 

when().thenReturn()成语是没有得到调用。该控件流向实际的jdbcTemplate。貌似没有与

JdbcTemplate jdbcTemplate = mock(JdbcTemplate.class); 

jdbcSpitterDao.setJdbcTemplate(jdbcTemplate); 

问题请你让我知道了什么错误?

+0

我不明白,一半的代码使用'JdbcSpitterDao',一半使用'JdbcTwitterDao'。这只是一个真正的持续错字,还是你有不同的类型?如果他们是不同的班级,那肯定会导致你看到的问题。 –

+0

:-)。这是真正的持续错字。在Stackoverflow中手动更改名称类型 –

+0

您是否在最后添加了一个断言来检查结果? – skaffman

回答

0

有这个建议不要嘲笑你不拥有的类型。总的来说,这是一个很好的建议,在这里真正有意义的是不要单元测试dao。为什么不只是对数据库进行操作的集成测试,并且不需要额外的逻辑?