为什么当我进行单元测试时,我会得到“最终懒惰的val”而不是“最终的val”的覆盖点?

时间:2015-07-08 06:52:10

标签: java scala sbt scalatest

我有一些代码(项目源可在此处获取 - https://github.com/natemurthy/testing-final-vals):

object Main extends App {
  final val NAME = "foo"
}

我正在使用ScalaTest和SBT Coverage插件来测试此代码:

import org.scalatest.{FlatSpec,Matchers}

class MainTest extends FlatSpec with Matchers {
  it should "have a name" in {
    Main.NAME shouldBe "foo"
  }
}

但由于某些原因,当我在此表达式中包含lazy修饰符时,我只获得覆盖点:

enter image description here

enter image description here

为什么会这样?

1 个答案:

答案 0 :(得分:3)

我的猜测是覆盖工具计算执行的行数。

final val NAME = "foo"被编译为字节码中的常量内联值,如Java中的private static final。访问变量时,您只需从字节码常量中读取值。 More Info on inlining constant values during compiling

另一方面,

final lazy val NAME = "foo"编译成一个惰性构造方法,因为JVM中没有惰性值。如果访问此变量,则执行惰性构造方法。 More info on scala lazy value bytecode generation