Jmockit / Spring模拟依赖仍然调用Real依赖

时间:2017-04-05 21:04:31

标签: spring jmockit

所以我整天都在坚持这个问题。

我正在测试Spring 3.2中的JdbcSupportDao类。如果您只是阅读代码,问题就会非常明显,但我将简要总结一下:

我在JdbcTemplate上使用@Mocked注释来模拟查询数据库。问题是,在编写Expectations块之后,仍在调用实际的JdbcTemplate方法,JMockit显然根本没有进入等式。

以下单元测试失败:

/*@RunWith(SpringJUnit4ClassRunner.class)*/
@RunWith(JMockit.class)
@ContextConfiguration(locations={"classpath:studentAggregateReport-servlet.xml", "classpath:applicationContext-hibernate.xml"})
public class JdbcSSODaoTest   extends AbstractTransactionalJUnit4SpringContextTests {

    @Mocked
    JdbcTemplate jdbcTemplate;

    List<String> unameList;


    SSODao ssoDao;

    String DUMMY_ALCID = "yattayattayatta";

    @Before
    public void constructDao() {
        this.ssoDao = new JdbcSSODao();
        ((JdbcSSODao) ssoDao).setJdbcTemplate(jdbcTemplate);
    }

    @Test
    public void testGetUnameFromAlcId() {
        unameList = new ArrayList<String>() {{
            add("PEEPEE");
        }};
        //((JdbcSSODao) ssoDao).setJdbcTemplate(jdbcTemplate);
        new Expectations() {{
            jdbcTemplate.query(anyString, (ResultSetExtractor<String>)any); result = unameList;
        }};

        String uname = ssoDao.getUnameFromAlcId(DUMMY_ALCID);

        assertNotNull(uname);
    }

}

以下是正在测试的类的代码:

public class JdbcSSODao extends JdbcDaoSupport implements SSODao {

    @Override
    public String getUnameFromAlcId(String alcid) {
        String sql = SSOSqlUtil.createGetUnameByAlcIdSql(alcid);
        logger.debug(sql);
        List<String> resultLst = getJdbcTemplate().query(sql, new RowMapper<String>() {
            public String mapRow(ResultSet rs, int rowNum) throws SQLException {
                return rs.getString(1);
            }
        });
        if(resultLst.isEmpty()) return null;
        return resultLst.get(0);
    }

}

请帮助:(

1 个答案:

答案 0 :(得分:0)

上帝的甜蜜母亲......

显然,您必须将模拟方法的参数转换为调用中使用的确切类型。这为我解决了这个问题:

    new Expectations() {{
        jdbcTemplate.query(anyString, (RowMapper<String>)any); result = unameList;
    }};