【问题标题】:Spark (scala) Unit test - Mocking an object memberSpark(scala)单元测试 - 模拟对象成员
【发布时间】:2015-12-26 08:43:45
【问题描述】:

我有一个 spark 应用程序,它涉及如下 2 个 scala 伴随对象。

object actualWorker {
  daoClient

  def update (data, sc) {
    groupedData = sc.getRdd(data).filter. <several_operations>.groupByKey
    groupedData.foreach(x => daoClient.load(x))
  }
}


object SparkDriver {
  getArgs
  sc = getSparkContext
  actualWorker.update(data, sc : sparkContext)

}

我面临的挑战是为这个 spark 应用程序编写单元测试。我正在使用 Mockito 和 ScalaTest、Junit 进行这些测试。

我无法在编写单元测试时模拟 daoClient。 [EDIT1:额外的挑战是我的 daoClient 不可序列化。因为我在 spark 上运行它,所以我只是将它放在一个对象(而不是类)中,它可以在 spark 上运行;但它使它不可单元测试]

我尝试了以下方法:

  1. 使 ActualWorker 成为一个可以将 uploadClient 传入的类 构造函数。创建一个客户端并在 Actual Worker 中实例化它 问题:任务不可序列化异常。
  2. 为上传客户端引入一个特征。但是我仍然需要在 SparkDriver 中的某个时间点实例化一个客户端,我担心这会导致 Task Not serializable 异常。

这里的任何输入将不胜感激。

PS:我对 Scala 和 spark 还很陌生

【问题讨论】:

  • 你不能模拟 object - 这没有任何意义。您可以模拟一个类,但该类必须扩展 Serializable(并且所有类变量也必须是可序列化的)
  • 我已经更新了我的问题,即为什么我在实际工作人员中使用对象而不是类。见 EDIT1。
  • 我开始发现stackoverflow.com/questions/22592811/… 很有帮助。一旦我有一个可行的解决方案,我会更新。同时让问题悬而未决,直到有人有更好/更好的解决方案。

标签: scala unit-testing junit apache-spark


【解决方案1】:

虽然技术上不完全是一个单元测试框架,但我使用https://github.com/holdenk/spark-testing-base 来测试我的 Spark 代码,它运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2015-09-05
    • 2010-10-03
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多