9

我正在尝试使用 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 从未被初始化。

4

1 回答 1

13

应该注意的是,这个 trait 是使用 DelayedInit 功能实现的,这意味着对象的字段在 main 方法执行之前不会被初始化。

用于 App 特征的 Scaladoc

所以你可以:

  • 将 val 定义为 final:final val name = "Greg"
  • 在访问名称字段之前触发 main 方法
  • 将名称定义为方法:def name = "Greg"
  • 将 name 定义为lazyval: lazy val name = "Greg"(所以在这种情况下,和前面一样,初始化的顺序无关紧要)
于 2013-03-11T19:18:53.373 回答