ScalaMock与lazy的一个小分享

ScalaMock与lazy的一个小分享
起因:用Mock写单元测试的时候,出现一个空指针错误,大致类似下面的报错
ScalaMock与lazy的一个小分享_第1张图片

代码详情:

import org.scalamock.scalatest.MockFactory
import org.scalatest.funsuite.AnyFunSuite

case class Dependency(string: String) {
}

class WrongClass(dependency: Dependency) {
  val wrong = dependency.string
}

class RightClass(dependency: Dependency) {
  lazy val wrong = dependency.string
}

class Demo extends AnyFunSuite with MockFactory{
  val wrongClass = mock[WrongClass]  // 会报错
  val rightClass = mock[RightClass]  // 正确能通过
}

原因:

  • Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量
  • ScalaMock在mock一个类的时候,
    • 首先会加载这个类,加载类的初始化阶段是虚拟机执行类构造器 () 方法的过程。() 是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的。
    • 但mock的时候构造函数传入的dependency是null,以至于在执行下面的类变量赋值动作的时候产生了空指针
  • 因此使用lazy关键字进行了懒加载之后,便能在类加载阶段跳过该类变量赋值动作

看图说话:
ScalaMock与lazy的一个小分享_第2张图片
ScalaMock与lazy的一个小分享_第3张图片

你可能感兴趣的:(scala)