模拟spark.read().format().options().load()但不模拟spark.table()

问题描述 投票:0回答:1

我有以下功能需要测试-

private HashMap<String, Dataset<Row>> getDataSources(SparkSession spark) {
        HashMap<String, Dataset<Row>> ds = new HashMap<String, Dataset<Row>>();

        Dataset<Row>dimTenant = spark.table(dbName + "." + SparkConstants.DIM_TENANT)
                .select("tenant_key", "tenant_id");

        Map<String, String> options = new HashMap<>();
                mockOptions.put("table", bookValueTable);
                mockOptions.put("zkUrl", zkUrl);


        Dataset<Row> bookValue = spark.read().format("org.apache.phoenix.spark")
                .options(options)
                .load();


        ds.put("dimTenant", dimTenant);
        ds.put("bookValue", bookValue);

        return ds;
    }

在这种情况下,我实际上需要执行

spark.table
,但需要基于
spark.read().format(formatParam).options(optionsParam).load()
formatParam
模拟
optionsParam

的输出

我怎样才能实现这个目标?

最初,我开始用深存根(答案)嘲笑

DataframeReader.class
,但结果是
spark.table
本身调用
spark.read().table
,因此
spark.table
受到了影响。然后我尝试监视
spark.read()
对象,但由于在调用过程中生成了一个新对象,因此它也不起作用。

unit-testing apache-spark mocking mockito powermockito
1个回答
0
投票

你可以

  • 提供您自己的
    spark.read().table()
    实现(即
    DataframeReader.table()
  • 检查表名参数,如果参数是
    dbName + "." + SparkConstants.DIM_TENANT
    则调用真正的spark,否则返回虚拟数据/null。

请参阅 使用回调进行存根

© www.soinside.com 2019 - 2024. All rights reserved.