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

nmu*_*thy 4 java scala sbt scalatest

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

object Main extends App {
  final val NAME = "foo"
}
Run Code Online (Sandbox Code Playgroud)

我正在使用ScalaTest和SBT Coverage插件来测试此代码,如下所示:

import org.scalatest.{FlatSpec,Matchers}

class MainTest extends FlatSpec with Matchers {
  it should "have a name" in {
    Main.NAME shouldBe "foo"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

在此处输入图片说明

为什么会这样呢?

Luk*_*ler 5

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

final val NAME = "foo"private static finalJava 中一样,在字节码中被编译为常量内联值。访问变量时,您只需从字节码常量中读取值即可。有关在编译期间内联常量值的更多信息

final lazy val NAME = "foo"另一方面,由于JVM中没有惰性值,因此可以编译为惰性构造方法。如果访问此变量,则会执行惰性构造方法。有关Scala惰性值字节码生成的更多信息