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
        }
    }
}

私の名前の出力は常にnullです。テスト中にメインオブジェクトがその機能を使用できるようにするにはどうすればよいですか?実際の使用では、Httpサーバーであるアプリがあり、メッセージを送信したいのですが、現在は初期化されていないため、サーバーは起動されません。この簡単な例は、Mainが初期化されないことを示しています。

4

1 に答える 1

13

このトレイトは DelayedInit 機能を使用して実装されることに注意してください。つまり、オブジェクトのフィールドは main メソッドが実行される前に初期化されません。

App トレイトの Scaladoc

したがって、次のいずれかを実行できます。

  • val を final として定義します。final val name = "Greg"
  • name フィールドにアクセスする前に main メソッドをトリガーする
  • name をメソッドとして定義:def name = "Greg"
  • name をlazyvalとして定義しますlazy val name = "Greg"(したがって、この場合も前の場合と同様に、初期化がどの順序で行われるかは関係ありません)
于 2013-03-11T19:18:53.373 に答える