【问题标题】:Why is mockito's when().thenReturn() not working?为什么 mockito 的 when().thenReturn() 不起作用?
【发布时间】: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 类并在这两个地方使用相同的函数来完成这项工作。
  • 您应该将此添加为答案,然后接受它。以便其他人可以从答案中受益。

标签: spring junit mockito


【解决方案1】:

建议不要模拟您不拥有的类型。总的来说,这是一个很好的建议,在这里根本不对该 dao 进行单元测试真的很有意义。为什么不只是在 DB 上运行且不执行额外逻辑的集成测试?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2017-07-21
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多