Jdbc模板的Java模糊方法错误

时间:2019-03-24 23:17:02

标签: java junit4 jdbctemplate easymock

在尝试测试数据访问对象实现类时,出现一条错误消息:“对于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);
    }
}

1 个答案:

答案 0 :(得分:0)

这应该有效:

   when(jdbcTemplate.query(any(String.class), any(RowMapperResultSetExtractor.class)))
       .thenReturn(yourReturnObject);

发件人:Mockito ambiguous method call