Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用于单元测试的Spark scala模拟spark.implicits

用于单元测试的Spark scala模拟spark.implicits
EN

Stack Overflow用户
提问于 2020-10-26 14:46:52
回答 1查看 873关注 0票数 2

在尝试使用Spark和Scala简化单元测试时,我使用了scala-test和mockito-scala (和mockito糖)。这只是让你做这样的事情:

代码语言:javascript
运行
AI代码解释
复制
val sparkSessionMock = mock[SparkSession]

然后你通常可以用“何时”和“验证”来完成所有的魔术。

但是,如果您有一些实现需要导入

代码语言:javascript
运行
AI代码解释
复制
import spark.implicits._

在它的代码中,单元测试的简单性似乎消失了(或者至少我还没有找到解决这个问题的最合适的方法)。

我最终得到了这个错误:

代码语言:javascript
运行
AI代码解释
复制
org.mockito.exceptions.verification.SmartNullPointerException: 
You have a NullPointerException here:
-> at ...
because this method call was *not* stubbed correctly:
-> at scala.Option.orElse(Option.scala:289)
sparkSession.implicits();

由于输入问题,简单地模拟SparkSession中“隐含的”对象上的调用是没有帮助的:

代码语言:javascript
运行
AI代码解释
复制
val implicitsMock = mock[SQLImplicits]
when(sparkSessionMock.implicits).thenReturn(implicitsMock)

不会让你通过,因为它说它需要你的mock中的对象类型:

代码语言:javascript
运行
AI代码解释
复制
require: sparkSessionMock.implicits.type
found: implicitsMock.type

请不要告诉我我应该做SparkSession.builder.getOrCreate()...从那时起,这不再是一个单元测试,而是一个更重的集成测试。

(编辑):这是一个完整的可重现的例子:

代码语言:javascript
运行
AI代码解释
复制
import org.apache.spark.sql._
import org.mockito.Mockito.when
import org.scalatest.{ FlatSpec, Matchers }
import org.scalatestplus.mockito.MockitoSugar

case class MyData(key: String, value: String)

class ClassToTest()(implicit spark: SparkSession) {
    import spark.implicits._

    def read(path: String): Dataset[MyData] = 
         spark.read.parquet(path).as[MyData]
}

class SparkMock extends FlatSpec with Matchers with MockitoSugar {

     it should "be able to mock spark.implicits" in {
         implicit val sparkMock: SparkSession = mock[SparkSession]
         val implicitsMock = mock[SQLImplicits]
         when(sparkMock.implicits).thenReturn(implicitsMock)
         val readerMock = mock[DataFrameReader]
         when(sparkMock.read).thenReturn(readerMock)
         val dataFrameMock = mock[DataFrame]
         when(readerMock.parquet("/some/path")).thenReturn(dataFrameMock)
         val dataSetMock = mock[Dataset[MyData]]
         implicit val testEncoder: Encoder[MyData] = Encoders.product[MyData]
         when(dataFrameMock.as[MyData]).thenReturn(dataSetMock)

         new ClassToTest().read("/some/path/") shouldBe dataSetMock
    }
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-29 23:46:48

你不能嘲笑暗示。隐含在编译时被解决,而模拟在运行时发生(运行时反射,通过Byte Buddy的字节码操作)。你不能在编译时导入那些只会在运行时被模仿的隐含内容。你必须手动解决隐式问题(原则上,如果你在运行时再次启动编译器,你可以在运行时解决隐式问题,但这将更难1 2 3 4)。

试一试

代码语言:javascript
运行
AI代码解释
复制
class ClassToTest()(implicit spark: SparkSession, encoder: Encoder[MyData]) {
  def read(path: String): Dataset[MyData] = 
    spark.read.parquet(path).as[MyData]
}

class SparkMock extends AnyFlatSpec with Matchers with MockitoSugar {

  it should "be able to mock spark.implicits" in {
    implicit val sparkMock: SparkSession = mock[SparkSession]
    val readerMock = mock[DataFrameReader]
    when(sparkMock.read).thenReturn(readerMock)
    val dataFrameMock = mock[DataFrame]
    when(readerMock.parquet("/some/path")).thenReturn(dataFrameMock)
    val dataSetMock = mock[Dataset[MyData]]
    implicit val testEncoder: Encoder[MyData] = Encoders.product[MyData]
    when(dataFrameMock.as[MyData]).thenReturn(dataSetMock)

    new ClassToTest().read("/some/path") shouldBe dataSetMock
  }
}

//[info] SparkMock:
//[info] - should be able to mock spark.implicits
//[info] Run completed in 2 seconds, 727 milliseconds.
//[info] Total number of tests run: 1
//[info] Suites: completed 1, aborted 0
//[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
//[info] All tests passed.

请注意,两个位置的"/some/path"应该是相同的。在您的代码片段中,两个字符串是不同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64539412

复制
相关文章
spark scala练习
spark scala练习 准备一个文件上传至hdfs hello word hello java hello python hello c++ ​ 启动spark-shell spark-shell 获取到要计算的文件 val file = spark.read.textFile("test.txt") 统计该文件的行数 file.count() 获取第一行的内容 file.first() 获取到特定的内容 val lines = file.filter(line => line.contains
许喜朝
2020/12/01
3260
Spark scala 操作
基本操作 创建RDD var data = Array(1,2,3,4) //数组 var distData = sc.parallelize(data,3) //创建RDD distData.collect //收集展示 distData.take(1) //取出第一行/数组中一个数据占一行 2.读取文件数据 var distFile = sc.textFile("data.txt")//按行读 distFile.take(1) //取出一行数据 //也可以同时读取多个文件,相当于多个文件拼接
Tim在路上
2020/08/04
5960
Scala--spark必备
Scala 是 Scalable Language 的简写,是一门多范式的编程语言。
程序员爱酸奶
2020/03/04
4530
Scala--spark必备
Spark Scala当中reduceByKey的用法
/*reduceByKey(function) reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行function的reduce操作(如前所述),因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。
马克java社区
2019/07/20
1.9K0
Spark Scala当中reduceByKey的用法
spark开发基础之从Scala符号入门Scala
问题导读 1.Scala中有哪些常见符号? 2.本文讲了哪些符号? 3.你对符号的理解是什么? 4.<-,->,=>,Int=,_ 它们含义是什么?用在什么地方? 当我们学习spark的时候,我们知道spark是使用Scala语言开发的,由于语言是相通的,所以对于传统程序员【Java,.net,c等】,我们能看懂Scala程序是没有问题的。但是当我们看到它的时候,却傻眼了。那么多符号,左箭头,右箭头,下划线等等搞得摸不着头脑。 看来如果想顺利的学习,我们必须学一下Scala了。很多都是从变量定义,函
用户1410343
2018/03/27
2.5K1
spark开发基础之从Scala符号入门Scala
基于scala语言的Spark环境搭建
IntelliJ IDEA版本:2019.3.4(community Edition)
liddytang
2023/09/26
5110
Spark基础-scala学习(五、集合)
集合 scala的集合体系结构 List LinkedList Set 集合的函数式编程 函数式编程综合案例:统计多个文本内的单词总数 scala的集合体系结构 scala中的集合体系主要包括:Iterable、Seq、Set、Map。其中Iterable是所有集合trait的根trait。这个结构与java的集合体系非常相似 scala中的集合是分成可变和不可变两类集合的,其中可变集合就是说,集合的元素可以动态修改,而不可变集合的元素在初始化之后,就无法修改了。分别对应scala.collection.m
老梁
2019/09/10
5700
IDEA开发Spark应用实战(Scala)
版权声明:欢迎转载,请注明出处,谢谢。 https://blog.csdn.net/boling_cavalry/article/details/87510822
程序员欣宸
2019/05/28
1.5K0
spark | 学习记录: 启动Scala、python
初学者,记录学习spark的最基本东西,不忘记 在spark下启动scala: ./bin/spark-shell 测试例子: sc.parallelize(1 to 1000).count() 在spark中启动python: ./bin/pyspark 测试例子: sc.parallelize(range(1000)).count()
努力在北京混出人样
2019/02/18
5200
Spark基础-scala学习(三、Trait)
面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait trait调用链 在trait中覆盖抽象方法 混合使用trait的具体方法和抽象方法 trait的构造机制 trati字段的初始化 让trait继承类 将trait作为接口使用 trait作为接口,和java中的接口非常类似 在triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现
老梁
2019/09/10
4970
Spark基础-scala学习(一、入门)
Scala解析器的使用 REPL:Read(取值)-> Evaluation(求值)-> Print(打印)->Loop(循环)。scala解析器也被称为REPL,会快速编译scala代码为字节码,然后交给JVM执行 val result = 1 设置变量不可变 var result = 2 可变的变量 val name: String = null 声明变量类型 val name: Any = "leo" val name1,name2:String = null 声明多个变量 val num1,num2
老梁
2019/09/10
7280
Spark常用的算子以及Scala函数总结
首先,介绍一下scala语言: Scala 是一种把面向对象和函数式编程理念加入到静态类型语言中的混血儿。
流川枫
2018/09/12
5K0
Spark常用的算子以及Scala函数总结
Mockito模拟进行单元测试
MOCK意思是模拟的意思,主要被用来进行数据的人工组织,不会真正地调用第三方服务器,类似redis,mysql等都不会调用,也不用关心数据底层是如何进行处理的,我们要做的只是将本单元的逻辑进行单元测试,验证数据的逻辑处理性,而其中mock较好的框架就是Mockito。
chinotan
2022/01/04
7K0
Mockito模拟进行单元测试
Spark Scala当中reduce的用法和例子
reduce将RDD中元素前两个传给输入函数,产生一个新的return值,将新产生的return值与RDD中下一个元素(即第三个元素)组成两个元素,再被传给输入函数,这样递归运作,直到最后只有一个值为止。*/ val rdd07 = sc.parallelize(1 to 10) val sum = rdd07.reduce((x, y) => x + y) println("sum is " + sum)
马克java社区
2019/07/16
2.1K0
Spark Scala当中reduce的用法和例子
Spark常用的算子以及Scala函数总结
上海站 | 高性能计算之GPU CUDA培训 4月13-15日 三天密集式学习 快速带你晋级 阅读全文 > 正文共11264个字,7张图,预计阅读时间28分钟。 Spark与Scala 首先,介绍一
用户1332428
2018/04/17
1.9K0
Spark常用的算子以及Scala函数总结
如何模拟一个XMLHttpRequest请求用于单元测试——nise源码阅读与分析
在我们进行单元测试的过程中,如果我们需要对一些HTTP接口进行相关的业务测试,那么我们就需要来模拟HTTP请求的发送与响应,否则我们就无法完成测试的闭环。
黄Java
2018/09/18
2.5K0
单元测试模拟框架:Nsubstitute
     Nsubstitute是一个开源的框架,源码是C#实现的。你可以在这里获得它的源码:https://github.com/nsubstitute/NSubstitute NSubstitute 更注重替代(Substitute)概念。它的设计目标是提供一个优秀的测试替代的.NET模拟框架。它是一个模拟测试框架,用最简洁的语法,使得我们能够把更多的注意力放在测试工作,减轻我们的测试配置工作,以满足我们的测试需求,帮助完成测试工作。它提供最经常需要使用的测试功能,且易于使用,语句更符合自然语言,可
张善友
2018/01/29
1.7K0
Mockito模拟进行单元测试
    MOCK意思是模拟的意思,主要被用来进行数据的人工组织,不会真正地调用第三方服务器,类似redis,mysql等都不会调用,也不用关心数据底层是如何进行处理的,我们要做的只是将本单元的逻辑进行单元测试,验证数据的逻辑处理性,而其中mock较好的框架就是Mockito。
chinotan
2019/07/15
9.5K0
Mockito模拟进行单元测试
scala-sparkML学习笔记:serializable custom transformer with spark-scala
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
MachineLP
2019/08/31
6550
spark里的hbase的ImmutableBytesWritable的打印问题scala
ImmutableBytesWritable其实就是hbase把其封装成的rowkey,如果要通过collect算子收集到客户端driver,涉及到序列化的操作:
gzq大数据
2021/05/18
6820

相似问题

导入spark.implicits时发现错误

25

Spark Scala单元测试失败

13

scala中的模拟spark列函数

318

单元测试:模拟嵌套scala val

10

在单元测试中模拟Spark RDD

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文