我想测试一个格式化为这样的方法:
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对象的存根,以及read
和option
方法返回的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.option
和dataFrameReaderStub.load
上收到一个错误,上面写着"无法解析符号选项"one_answers"无法解析码元加载"。但是这些方法肯定存在于spark.read
返回的对象上。
我该如何解决这个错误,或者有更好的方法来模拟/测试我的代码吗?
我建议您看看这个库来测试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加载测试数据,或者用程序生成它(如果它包含时间戳等(。