gpt4 book ai didi

scala - 模拟 SparkSession 进行单元测试

转载 作者:行者123 更新时间:2023-12-03 19:35:46 26 4
gpt4 key购买 nike

我的 spark 应用程序中有一个从 MySQL 数据库加载数据的方法。该方法看起来像这样。

trait DataManager {

val session: SparkSession

def loadFromDatabase(input: Input): DataFrame = {
session.read.jdbc(input.jdbcUrl, s"(${input.selectQuery}) T0",
input.columnName, 0L, input.maxId, input.parallelism, input.connectionProperties)
}
}

该方法除了执行 jdbc 之外什么都不做。方法并从数据库中加载数据。我该如何测试这种方法?标准方法是创建对象 session 的模拟。这是 SparkSession 的一个实例.但是自从 SparkSession有一个私有(private)构造函数我无法使用 ScalaMock 模拟它。

这里的主要问题是我的函数是一个纯粹的副作用函数(副作用是从关系数据库中提取数据),鉴于我在模拟 SparkSession 时遇到问题,我如何对这个函数进行单元测试.

那么有什么方法可以模拟 SparkSession还是比模拟测试这种方法更好的方法?

最佳答案

在您的情况下,我建议不要模拟 SparkSession。这或多或少会模拟整个功能(无论如何您都可以这样做)。如果您想测试此功能,我的建议是运行嵌入式数据库(如 H2)并使用真正的 SparkSession。为此,您需要将 SparkSession 提供给您的 DataManager。 .

未经测试的草图:

你的代码:

class DataManager (session: SparkSession) {
def loadFromDatabase(input: Input): DataFrame = {
session.read.jdbc(input.jdbcUrl, s"(${input.selectQuery}) T0",
input.columnName, 0L, input.maxId, input.parallelism, input.connectionProperties)
}
}

你的测试用例:
class DataManagerTest extends FunSuite with BeforeAndAfter {
override def beforeAll() {
Connection conn = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");
// your insert statements goes here
conn.close()
}

test ("should load data from database") {
val dm = DataManager(SparkSession.builder().getOrCreate())
val input = Input(jdbcUrl = "jdbc:h2:~/test", selectQuery="SELECT whateveryounedd FROM whereeveryouputit ")
val expectedData = dm.loadFromDatabase(input)
assert(//expectedData)
}
}

关于scala - 模拟 SparkSession 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49483987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com