扩展App trait的对象内的字段设置为null。为什么会这样?

时间:2013-03-11 19:10:10

标签: scala scalatest

我正在尝试使用scalatest来测试这样的应用程序:

object Main extends App {
    val name = "Greg"
}

class JunkTests extends FunSpec with MustMatchers {
    describe("Junk Tests") {
        it("Junk-1 -- Must do stuff") {
            println("Name: "+Main.name)
            // some test here
        }
    }
}

我的名字输出始终为空。如何让我的主要对象在测试期间使用它的设施?在实际使用中,我有一个应用程序,它是一个Http服务器,我想发送它消息,但现在它从未初始化,所以服务器永远不会启动。这个简单的例子表明Main永远不会被初始化。

1 个答案:

答案 0 :(得分:12)

  

应该注意的是,这个特性是使用   DelayedInit功能,表示对象的字段将   在main方法执行之前尚未初始化。

Scaladoc for App trait

所以你可以:

  • 将val定义为final:final val name = "Greg"
  • 在访问名称字段之前触发主要方法
  • 将名称定义为方法:def name = "Greg"
  • 将名称定义为lazy val:lazy val name = "Greg"(所以在这种情况下,以及之前的版本,无论初始化顺序如何)