Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 单元测试的模拟SparkSession_Scala_Unit Testing_Apache Spark_Mocking_Scalamock - Fatal编程技术网

Scala 单元测试的模拟SparkSession

Scala 单元测试的模拟SparkSession,scala,unit-testing,apache-spark,mocking,scalamock,Scala,Unit Testing,Apache Spark,Mocking,Scalamock,我的spark应用程序中有一个从MySQL数据库加载数据的方法。这个方法看起来像这样 trait DataManager { val session: SparkSession def loadFromDatabase(input: Input): DataFrame = { session.read.jdbc(input.jdbcUrl, s"(${input.selectQuery}) T0", input.columnName, 0L

我的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
方法并从数据库中加载数据外,没有其他功能。如何测试此方法?标准方法是创建对象
会话
的模拟,该对象是
SparkSession
的实例。但是由于SparkSession有一个私有构造函数,我无法使用ScalaMock模拟它

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


那么,有没有什么方法可以模拟SparkSession或其他比模拟更好的方法来测试这个方法呢

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

未经测试的草图:

您的代码:

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)
  }
}

您可以使用mockito scala来模拟SparkSession,如所示。

可能重复@himanshuiiTian这不是该问题的重复。我的问题非常特定于一个用例,在这个用例中,我的方法只从数据库加载数据,如果可能的话,我如何使用mock或任何其他方法来测试它。你链接的问题不是关于如何模仿它或如何处理非常具体的场景……好吧!我认为它和它很相似。很抱歉造成混淆。您到底想测试什么?是否可以执行查询?老实说,我不会测试这个方法,因为它不包含任何由您实现的逻辑(无意冒犯)。您只是在运行spark提供的一些逻辑-这应该在他们这方面进行测试。如果你想测试这一点,你可以使用嵌入式数据库。或者我把你的问题搞错了,你问谁来创建spark会话?现在开始:
SparkSession.builder().getOrCreate()