【发布时间】: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 上运行;但它使它不可单元测试]
我尝试了以下方法:
- 使 ActualWorker 成为一个可以将 uploadClient 传入的类 构造函数。创建一个客户端并在 Actual Worker 中实例化它 问题:任务不可序列化异常。
- 为上传客户端引入一个特征。但是我仍然需要在 SparkDriver 中的某个时间点实例化一个客户端,我担心这会导致 Task Not serializable 异常。
这里的任何输入将不胜感激。
PS:我对 Scala 和 spark 还很陌生
【问题讨论】:
-
你不能模拟
object- 这没有任何意义。您可以模拟一个类,但该类必须扩展 Serializable(并且所有类变量也必须是可序列化的) -
我已经更新了我的问题,即为什么我在实际工作人员中使用对象而不是类。见 EDIT1。
-
我开始发现stackoverflow.com/questions/22592811/… 很有帮助。一旦我有一个可行的解决方案,我会更新。同时让问题悬而未决,直到有人有更好/更好的解决方案。
标签: scala unit-testing junit apache-spark