【问题标题】:Error when trying to mock a DataFrameReader object when using ScalaMock使用 ScalaMock 时尝试模拟 DataFrameReader 对象时出错
【发布时间】:2020-04-20 14:35:26
【问题描述】:

我想测试一个我们拥有的方法,其格式如下:

def extractTable( spark: SparkSession, /* unrelated other parameters */ ): DataFrame = {
  // Code before that I want to test
  val df = spark.read
    .format("jdbc")
    .option("url", "URL")
    .option("driver", "<Driver>")
    .option("fetchsize", "1000")
    .option("dbtable", "select * from whatever")
    .load()
  // Code after that I want to test 
}  

我正在尝试制作 spark 对象的存根,以及 readoption 方法返回的 DataFrameReader 对象:

val sparkStub = stub[ SparkSession ]
val dataFrameReaderStub = stub[ DataFrameReader ]

( dataFrameReaderStub.format _).when(*).returning( dataFrameReaderStub ) // Works
( dataFrameReaderStub.option _).when(*, *).returning( dataFrameReaderStub ) // Error
( dataFrameReaderStub.load _).when(*).returning( ??? ) // Return a dataframe // Error

( sparkStub.read _).when().returning( dataFrameReaderStub )  

但我在dataFrameReaderStub.optiondataFrameReaderStub.load 上收到一条错误消息,上面写着“无法解析符号选项”和“无法解析符号加载”。但是这些方法肯定存在于spark.read 返回的对象上。

我该如何解决这个错误,或者有没有更好的方法来模拟/测试我的代码?

【问题讨论】:

    标签: scala mocking scalamock


    【解决方案1】:

    我建议你看看这个库来测试 Spark 代码:https://github.com/holdenk/spark-testing-base

    将此与您的测试套件混合:https://github.com/holdenk/spark-testing-base/wiki/SharedSparkContext ...或者,使用本地 [2] 主服务器启动您自己的 SparkSession。并从 csv/parquet/json 加载测试数据。

    模拟 Spark 课程会非常痛苦,而且可能不会成功。我是根据这里的经验说的,既使用 Spark 工作了很长时间,又将 ScalaMock 维护为一个库。

    您最好在测试中使用 Spark,但不要针对真实数据源。 相反,从 csv/parquet/json 加载测试数据,或以编程方式生成它(如果它包含时间戳等)。

    【讨论】:

    • 我不同意缺少 scalaMock,但我不确定这将如何提供帮助。我有一个在 spark.read 命令前后有一堆代码的方法,这就是我要测试的代码。例如,代码生成一个oracle查询,用于提取数据,然后将其传递给spark.read,如何在方法中间注入自己的spark.read
    • 你可能需要一种不同的方式来抽象你的代码,例如可以在测试代码中替换的分层混合(或 DI 注入)特征
    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多