我有一些代码(项目源可在此处获取 - 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
修饰符时,我只获得覆盖点:
为什么会这样?
答案 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