2013-03-11 1 views
5

私はこのようなアプリケーションをテストするためにscalatestを使用しようとしている:App traitを継承するオブジェクト内部のフィールドはnullに設定されます。どうしてこんなことに?

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が決して初期化されないことを示しています。

答えて

10

なお、この特性は、mainメソッドが実行される前にオブジェクトのフィールドが 初期化されていないことを意味 DelayedInit機能を用いて実装されることに留意すべきです。

Scaladoc for App trait

だからあなたがいずれかをすることができます:

  • はfinalとしてvalの定義:final val name = "Greg"
  • トリガーmainメソッドを
  • 名フィールドにアクセスする前に、メソッドとして名を定義します。def name = "Greg"
  • を名前をlazyと定義します。値:lazy val name = "Greg"(この場合、以前と同様に、どのような順序で初期化を行っても問題ありません)
+1

怠け者は私のために働きました。最終的には行動を変えなかった。 – hughw

関連する問題