2012-01-31 8 views
8

मैं ग्रोवी-2.0 के लिए स्पॉक का उपयोग करके इकाई परीक्षण लिख रहा हूं, और चलाने के लिए ग्रेडल का उपयोग कर रहा हूं। यदि मैं परीक्षा पास के बाद लिखता हूं।यूनिट परीक्षण ग्रोवी 2.0 स्पॉक के साथ: सेटअप()

import spock.lang.Specification 

class MyTest extends Specification { 

    def "test if myMethod returns true"() {  
    expect: 
     Result == true; 
    where: 
     Result = new DSLValidator().myMethod() 

    } 
} 

MyMethod() DSLValidator कक्षा में एक सरल विधि, कि बस सच रिटर्न है।

लेकिन अगर मैं एक सेटअप() फ़ंक्शन लिख सकते हैं और सेटअप में वस्तु() बनाने के लिए, अपने परीक्षण में विफल रहता है: Gradel का कहना है: विफल: java.lang.NullPointerException: अशक्त वस्तु पर विधि MyMethod() आह्वान नहीं किया जा सकता

सेटअप(),

import spock.lang.Specification 

class MyTest extends Specification { 

    def obj 

    def setup(){ 
    obj = new DSLValidator() 
    } 

    def "test if myMethod returns true"() {  
    expect: 
     Result == true; 
    where: 
     Result = obj.myMethod() 

    } 
}  

क्या कोई मदद कर सकता है, इसके बाद यह दिखता है?

import spock.lang.Specification 

class DSLValidatorTest extends Specification { 

    def validator 

    def setup() { 
    validator = new DSLValidator() 
    } 


    def "test if DSL is valid"() { 

     expect: 
     true == validator.isValid() 
    } 
} 

उत्तर

20

स्पॉक में उदाहरण के खेतों में जमा हो जाती वस्तुओं सुविधा तरीकों के बीच साझा नहीं कर रहे हैं:

यहाँ समाधान मैं इस समस्या को मिला है। इसके बजाए, प्रत्येक फीचर विधि को अपना ऑब्जेक्ट मिलता है।

आप सुविधा तरीकों के बीच एक वस्तु साझा करने के लिए की जरूरत है, एक @Shared क्षेत्र घोषणा करते हैं।

class MyTest extends Specification { 
    @Shared obj = new DSLValidator() 

    def "test if myMethod returns true"() {  
     expect: 
      Result == true 
     where: 
      Result = obj.myMethod() 
    } 
} 

class MyTest extends Specification { 
    @Shared obj 

    def setupSpec() { 
     obj = new DSLValidator() 
    } 

    def "test if myMethod returns true"() {  
     expect: 
      Result == true 
     where: 
      Result = obj.myMethod() 
    } 
} 

वहाँ पर्यावरण की स्थापना के लिए 2 स्थिरता तरीके हैं:

def setup() {}   // run before every feature method 
def setupSpec() {}  // run before the first feature method 

मुझे समझ नहीं आता क्यों setupSpec() काम करता है के साथ दूसरे उदाहरण और setup() क्योंकि documentation में साथ विफल अन्यथा कहता है:

नोट: setupSpec() और cleanupSpec() विधियां इंस्टेंस फ़ील्ड का संदर्भ नहीं दे सकती हैं।

+0

अजीब ... स्पॉक दस्तावेज़ वास्तव में इस पर स्पष्टीकरण के साथ कर सकते हैं ... मैं नहीं कहूंगा कि ओबीजे सुविधा विधियों के बीच साझा किया जा रहा है, लेकिन प्रत्येक स्थिरता के पहले इसे स्थापित किया जा रहा है ... –

+5

क्या यह है कि आप समझ में नहीं आता है? एक @ शेर फ़ील्ड _is_ सुविधा विधियों के बीच साझा किया गया है और इसे फ़ील्ड प्रारंभकर्ता या 'setupSpec' विधि के साथ स्थापित किया जाना चाहिए। 'सेटअप' यहां एक अच्छी पसंद नहीं है क्योंकि इसे' कहां 'ब्लॉक के मूल्यांकन के बाद बुलाया जाता है। –

+0

स्पष्टीकरण के लिए धन्यवाद –

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