所以我整天都在坚持这个问题。
我正在测试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);
}
}
请帮助:(
答案 0 :(得分:0)
上帝的甜蜜母亲......
显然,您必须将模拟方法的参数转换为调用中使用的确切类型。这为我解决了这个问题:
new Expectations() {{
jdbcTemplate.query(anyString, (RowMapper<String>)any); result = unameList;
}};