有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法让mockito模拟公共类的公共方法

我试图模拟resultstrow对象的getMeasureAggregator(),但似乎没有成功。我对编写mockito单元测试非常陌生

我希望BuilSQL.formatMeasuer()转到case 2:所以我决定做的是模拟行。getMeasureAggregator

以下是我的BuildSQL类:

public class SQLBuilder {

    public static String buildSQL(JsonObject requestData, JsonObject queryInfo) throws AcquisitionException {
        JsonArray jArray = queryInfo.get("columns").getAsJsonArray();
        Set<String> columns = new HashSet<>(jArray.size());
        for (int i = 0; i < jArray.size(); i++) {
            columns.add(jArray.get(i).getAsString());
        }
        List<ResultSetRow> selectedRows = new ArrayList<>();
        List<ResultSetRow> retrievedRows = null;
        retrievedRows = MetaDataProvider.executeMetadataRequest(queryInfo, requestData); // this method returns a collection of RetrievedResultSetRow

        for (ResultSetRow retrievedRow: retrievedRows) {
            if (//some condition evaluates to true) {
                selectedRows.add(retrievedRow);
            }
        }

        String sql = "";
        String select = "SELECT ";
        for (int i = 0; i < selectedRows.size(); i++) {
            ResultSetRow row = selectedRows.get(i);
            select += formatMeasure(row.getMeatureName(), row.getMeasureAggregator());            
        }
        select = select.substring(0, select.length() - 1);
        return sql;
    }

    private static String formatMeasure(String measureName, int measureAggregator) {
        switch(measureAggregator) {
            case 1:
                return "sum(\"" + measureName + "\")" + " AS \"" + measureName + "\",";
            case 2:
                return "COUNT(\"" + measureName + "\")" + " AS \"" + measureName + "\",";
        return measureName;
    }
}

这是我的ResultStrow类:

public class ResultSetRow {
    private final int iRow;
    private final int measureAggregator;

    public ResultSetRow(JsonObject dimensionMetadata) {
        this.iRow = dimensionMetadata.get("ROW").getAsInt();
        this.measureAggregator = dimensionMetadata.get("MEASURE_AGGR").getAsInt();
    }

    public int getMeasureAggregator() {
        return measureAggregator;
    }

}

这就是我嘲笑的方式

@RunWith(PowerMockRunner.class)
@PrepareForTest({ HanaClientRequestUtils.class, RetrievedResultSetRow.class })

public class HanaSQLBuilderTest {
    private ResultSetRow resultSetRow;
    private requestData;
    private queryInfo



    @Test
    public void formatMeatureExecuteCase2() throws Exception{
        resultSetRow = Mockito.mock(ResultSetRow.class);
        PowerMockito.when(resultSetRow.getMeasureAggregator()).thenReturn(2);
        String querySQL = HanaSQLBuilder.buildSQL(requestData, queryInfo);
        System.out.println(querySQL);
        }
    }
}

我不知道为什么row.getMeasureAggregator()不返回2


共 (1) 个答案

  1. # 1 楼答案

    除了我上面的评论(我是手工编码的,请原谅我的一些错误)。 您可以尝试在buildSQL方法中添加retrievedRows作为参数:

    public static String buildSQL(
        JsonObject requestData,
        JsonObject queryInfo,
        List<ResultSetRow> retrievedRows) throws AcquisitionException {
          // ... rest of Your code adopted to new parameter
    

    }

    然后提供填充了mock的retrievedRows

    @Test
    public void formatMeatureExecuteCase2() throws Exception{
        resultSetRow = Mockito.mock(ResultSetRow.class);
        PowerMockito.when(resultSetRow.getMeasureAggregator()).thenReturn(2);
    
        List<ResultSetRow> retrievedRowsMock = new ArrayList<>(1);
        retrievedRowsMock.add(resultSetRow);
    
        String querySQL = HanaSQLBuilder.buildSQL(requestData, queryInfo, retrievedRowsMock);
        System.out.println(querySQL);
        }
    }
    

    我希望它能引导你们找到解决办法