在尝试测试数据访问对象实现类时,出现一条错误消息:“对于JdbcTemplateTestWrapper类型,方法query(String,Object [],ResultSetExtractor,Class)模棱两可”。在引发错误的行中,我试图使用EasyMock匹配器来匹配传递到被调用的方法“ query”中的参数。请有人可以解释为什么我会收到此错误吗?注意:为测试目的而创建的JdbcTemplateTestWrapper扩展了JdbcTemplateWrapper。
在我的JUnit测试中引发错误的行:
expect(jdbcTemplate.query(EasyMock.anyObject(), EasyMock.anyObject(),
EasyMock.anyObject(), EasyMock.anyObject())).andReturn(tranList);
需要期望的数据访问对象实现类中的方法调用:
tranList = (List<TransactionSummary>) jdbcTemplate.query(sqlStatement,
args, new RowMapperResultSetExtractor(mapper),
TransactionSummary.class);
在我的JdbcTemplateTestWrapper类中调用方法“查询”:
public <T> List<T> query(String sql, Object[] args, ResultSetExtractor extractor, Class<T> returnType) {
List<T> list = null;
try {
list = (List<T>) jdbcOperations.query(sql, args, extractor);
} catch (DataAccessException e) {
throw new RuntimeException("Problem retrieving data from AS400",
e);
}
return list;
}
JdbcTemplateWrapper中的“查询”方法被JdbcTemplateTestWrapper中的方法覆盖:
public <T> List<T> query(String sql, Object[] args, ResultSetExtractor
extractor, Class<T> returnType) {
long queryStartTime = 0;
long queryEndTime = 0;
StringBuilder queryArgs = new StringBuilder();
try {
queryStartTime = System.currentTimeMillis();
@SuppressWarnings("unchecked")
List<T> results = (List<T>) super.query(sql, args, extractor);
queryEndTime = System.currentTimeMillis();
try{
if(isLogSQLCalls() && ((queryEndTime - queryStartTime) >
queryExecutionTime)){
//Uncomment following line to get the JDBC Call
//message printed to tomcat window/tomcat log file
//StringBuilder loggerInfo = buildLogMessage(sql,
//args, queryStartTime, queryEndTime,
//results.size());
for (Object object : args) {
queryArgs.append(object + " # ");
}
updateAuditLogDao.logJDBCCall(sql, queryArgs,
queryStartTime, queryEndTime, results.size(), 0);
//Uncomment following line to get the JDBC Call
//message printed to tomcat window/tomcat log file
//LOGGER.info(loggerInfo);
}
}catch(Exception exception){
LOGGER.fatal(exception, exception);
}
return results;
} catch (DataAccessException e) {
queryEndTime = System.currentTimeMillis();
try{
if(isLogSQLCalls() && ((queryEndTime - queryStartTime) >
queryExecutionTime)){
updateAuditLogDao.logJDBCCall(sql, queryArgs,
queryStartTime, queryEndTime, 0, 1);
}
}catch(Exception exception){
LOGGER.fatal(exception, exception);
}
LOGGER.fatal(e, e);
throw new RuntimeException("Problem retrieving data from AS400",
e);
}
}
答案 0 :(得分:0)
这应该有效:
when(jdbcTemplate.query(any(String.class), any(RowMapperResultSetExtractor.class)))
.thenReturn(yourReturnObject);