gpt4 book ai didi

java - 为什么当我进行单元测试时,我得到的覆盖点是 `final lazy val` 而不是 `final val`?

转载 作者:搜寻专家 更新时间:2023-11-01 02:23:47 25 4
gpt4 key购买 nike

我有一些代码(此处提供项目源 - 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

为什么会这样?

最佳答案

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

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

关于java - 为什么当我进行单元测试时,我得到的覆盖点是 `final lazy val` 而不是 `final val`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31285452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com