无法获得模拟公共类的公共方法的模拟

时间:2019-05-06 20:38:17

标签: java mockito

我正在尝试模拟ResultSetRow对象的getMeasureAggregator()-我似乎没有成功。我在编写模拟单元测试方面非常陌生。

我希望BuilSQL.formatMeasuer()进入case 2:所以我决定要做的是模拟row.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;
    }
}

这是我的ResultSetRow类:

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 个答案:

答案 0 :(得分:1)

除了以上我的评论(我正在手工编码,请原谅我一些错误)。 您可以尝试在您的buildSQL方法中添加一个import json if json_string: x = json.loads(json_string) else: // Your logic here x = {} 作为参数:

retrievedRows

}

然后提供您的public static String buildSQL( JsonObject requestData, JsonObject queryInfo, List<ResultSetRow> retrievedRows) throws AcquisitionException { // ... rest of Your code adopted to new parameter 充满模拟物

retrievedRows

我希望它能指导您解决问题。