2013-03-11 3 views
5

मैं 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 
     } 
    } 
} 

मेरा नाम उत्पादन हमेशा रिक्त है। परीक्षण के दौरान मैं अपनी मुख्य वस्तु को अपनी सुविधाओं का उपयोग कैसे कर सकता हूं? वास्तविक उपयोग में मेरे पास एक ऐप है जो एक एचटीपी सर्वर है और मैं इसे संदेश भेजना चाहता हूं, लेकिन अभी यह कभी शुरू नहीं हुआ है, इसलिए सर्वर कभी शुरू नहीं हुआ है। यह सरल उदाहरण दिखाता है कि मुख्य कभी शुरू नहीं हुआ है।

उत्तर

10

यह ध्यान दिया जाना चाहिए कि इस विशेषता DelayedInit कार्यक्षमता, जिसका अर्थ होगा कि वस्तु के क्षेत्र से पहले मुख्य विधि निष्पादित कर दिया गया है प्रारंभ नहीं किया गया है का उपयोग कर कार्यान्वित किया जाता है।

Scaladoc for App trait

तो तुम कर सकते हैं:

  • वैल परिभाषित अंतिम रूप: def name = "Greg"
  • : final val name = "Greg"
  • ट्रिगर मुख्य विधि नाम क्षेत्र
  • एक्सेस करने से पहले विधि के रूप में परिभाषित नाम नाम को lazy वैल:के रूप में परिभाषित करें(इसलिए इस मामले में, साथ ही साथ, कोई फर्क नहीं पड़ता कि ऑर्डर प्रारंभ करने में कोई फर्क नहीं पड़ता)
+1

वैल आलसी मेरे लिए काम करता है; इसे अंतिम बनाने से व्यवहार में बदलाव नहीं आया। – hughw

संबंधित मुद्दे