2013-03-11 17 views
5

Sto cercando di utilizzare ScalaTest per testare un app come questo:Il campo all'interno dell'oggetto che estende il tratto App è impostato su null. Perchè è così?

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

La mia uscita nome è sempre nullo. Come posso ottenere che il mio oggetto principale utilizzi le sue strutture durante un test? In pratica ho un'app che è un server Http e voglio inviarlo messaggi, ma al momento non è mai stato inizializzato, quindi il server non viene mai avviato. Questo semplice esempio mostra che Main non viene mai inizializzato.

risposta

10

Occorre notare che questa caratteristica è implementato utilizzando la funzionalità DelayedInit, il che significa che i campi dell'oggetto saranno non sono stati inizializzati prima è stato eseguito il metodo principale.

Scaladoc for App trait

Quindi è possibile:

  • definire val come finale: Metodo final val name = "Greg"
  • principale fattore scatenante prima di accedere a nome del campo
  • Definisci nome come metodo: def name = "Greg"
  • definire il nome come lazy val: lazy val name = "Greg" (quindi in questo caso, così come in precedenza, non c'è alcun problema in quale ordine di inizializzazione è fatto)
+1

rendendo il val pigro funzionato per me; rendendolo definitivo non ha cambiato il comportamento. – hughw

Problemi correlati