2013-03-11 14 views
5

Próbuję użyć scalatest przetestować aplikację tak:Pole wewnątrz obiektu, które rozszerza cechę aplikacji, jest ustawione na wartość null. Dlaczego to jest takie?

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

moje wyjście nazwa jest zawsze zerowa. Jak mogę przekonać mój główny obiekt do korzystania z jego obiektów podczas testu? W rzeczywistości mam aplikację, która jest serwerem Http i chcę wysyłać jej wiadomości, ale teraz jej nigdy nie inicjalizowano, więc serwer nigdy się nie uruchamia. Ten prosty przykład pokazuje, że Main nie jest inicjowany.

Odpowiedz

10

Należy zauważyć, że ta cecha jest realizowane z wykorzystaniem funkcjonalności DelayedInit, co oznacza, że ​​pola obiektu będzie nie zostały zainicjowane przed głównym metoda została wykonana.

Scaladoc for App trait

Więc można:

  • określić val jako końcowy: metoda final val name = "Greg"
  • spust główny przed uzyskaniem dostępu do nazwy pola
  • zdefiniować nazwisko jako metody: def name = "Greg"
  • zdefiniuj nazwę jako lazy val: lazy val name = "Greg" (tak w tym przypadku, jak również w poprzednim, nie ma znaczenia, w jakiej inicjalizacji zlecenia jest wykonywana)
+1

sprawił, że val lazy pracował dla mnie; uczynienie go ostatecznym nie zmieniło zachowania. – hughw

Powiązane problemy