Ошибка при попытке смоделировать объект DataFrameReader при использовании ScalaMock - PullRequest
0 голосов
/ 20 апреля 2020

Я хочу протестировать наш метод, который отформатирован примерно так:

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, а объекты DataFrameReader - read и option методы возвращают:

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, в котором говорится «Не удается разрешить опцию символа» и «Не удается разрешить загрузку символа». Но эти методы определенно существуют для объекта, который spark.read возвращает.

Как я могу устранить эту ошибку, или есть лучший способ смоделировать / протестировать мой код?

1 Ответ

0 голосов
/ 20 апреля 2020

Я бы посоветовал вам взглянуть на эту библиотеку для тестирования кода Spark: https://github.com/holdenk/spark-testing-base

Смешайте это с вашим набором тестов: https://github.com/holdenk/spark-testing-base/wiki/SharedSparkContext .. Или, в качестве альтернативы, раскрутите свой собственный SparkSession с локальным мастером [2]. и загрузить тестовые данные из csv / parquet / json.

Классы Mocking Spark будут довольно болезненными и, вероятно, не будут успешными. Я говорю по своему опыту: и долгое время работал со Spark, и поддерживал ScalaMock в качестве библиотеки.

Вам лучше использовать Spark в своих тестах, но не против реальных источников данных. Вместо этого загрузите тестовые данные из csv / parquet / json или программно сгенерируйте их (если они содержат метки времени и т. Д.).

...