2012-08-13 16 views
12

मुझे अपने परीक्षणों में मेरे डोमेन ऑब्जेक्ट्स में इंजेक्शन देने की आवश्यकता है।Grails में निर्भरता इंजेक्शन स्पॉक विशिष्टता परीक्षण

यह परीक्षण परीक्षण/एकीकरण निर्देशिका में रखे गए हैं और spock.lang.Specification से फैले हुए हैं।

मैं इसे कैसे प्राप्त कर सकता हूं?

नोट: मैंने यह पोस्ट How to inject spring beans into spock test देखा है, लेकिन यह grails से संबंधित नहीं है।

संपादित करें:

निर्भरता मैं इंजेक्शन प्राप्त करना चाहते हैं मेरी SecUser उपवर्ग Player बुलाया में springSecurityService है। असफल होने वाली विधि encodePassword() है, जिसे beforeInsert() में कहा जाता है।

मैं कुछ परीक्षणों में इस encodePassword() विधि नकली सकता है, लेकिन जब मैं अपने नियंत्रकों विधि save() परीक्षण करना चाहते हैं, मैं Player कि क्योंकि यह सब नियंत्रकों विधि के अंदर होता है बनाया जा रहा है नकली नहीं कर सकते।

package intertigre.test.domain 
import intertigre.domain.Fecha; 
import intertigre.test.util.DomainFactoryTestService 
import grails.plugin.spock.IntegrationSpec 
import grails.test.mixin.TestFor 

    @TestFor(Fecha) 
    class FechaSpec extends IntegrationSpec{ 

    DomainFactoryTestService domainFactoryTestService = new DomainFactoryTestService() 

    def 'test'(){ 
     given: 
      def fecha = new Fecha() 
     when: 
      fecha.save() 
     then: 
      Fecha.get(1) == fecha 
    } 

} 

जब grails test-app :spock चल मैं इस अपवाद हो रही है::

java.lang.NullPointerException: Cannot get property 'mainContext' on null object 
    at grails.plugin.spock.IntegrationSpec.$spock_initializeSharedFields(IntegrationSpec.groovy) 

और यह एक जब मैं परीक्षण अकेले चलाने

IntegrationSpec विस्तार करने के लिए बदलने के बाद, यह अपने परीक्षण कोड है:

| Failure: intertigre.test.domain.FechaSpec 
| java.lang.NullPointerException: Cannot get property 'autowireCapableBeanFactory' on null object 
    at grails.plugin.spock.IntegrationSpec.setupSpec(IntegrationSpec.groovy:47) 
| Failure: intertigre.test.domain.FechaSpec 
| java.lang.NullPointerException: Cannot invoke method isActive() on null object 
    at grails.test.mixin.support.GrailsUnitTestMixin.shutdownApplicationContext(GrailsUnitTestMixin.groovy:232) 
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:176) 
    at org.spockframework.runtime.extension.builtin.JUnitFixtureMethodsExtension$FixtureType$FixtureMethodInterceptor.intercept(JUnitFixtureMethodsExtension.java:145) 
    at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:84) 
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:176) 
+0

'@ ऑटोवायर', हो सकता है? जब आप अपने परीक्षण चलाते हैं तो क्या आपके grails एप्लिकेशन चल रहा है? – Will

+0

शायद इन निर्भरताओं का नकल करना बेहतर विचार है? क्या निर्भरता इंजेक्शन नहीं है? एक समस्या दिखाने के लिए कुछ उदाहरण कोड लिखें। –

+0

मैंने कभी Grails में @Autowired का उपयोग करने की कोशिश नहीं की है, मैं इसे आज़माउंगा। जब मैं परीक्षण चलाता हूं तो मैं ऐप नहीं चला रहा हूं। –

उत्तर

12

springSecurityService को घोषित करने का प्रयास करें परीक्षण, जैसा कि आप एक नियंत्रक में करेंगे।

package intertigre.test.domain 
import intertigre.domain.Fecha; 
import intertigre.test.util.DomainFactoryTestService 
import grails.plugin.spock.IntegrationSpec 

class DomainFactoryTestServiceSpec extends IntegrationSpec{ 

def domainFactoryTestService // you dont need to create a new instance, it's injected by spring 

def 'test'(){ 
    given: 
     // ... 
    when: 
     // ... 
    then: 
     // .... 
} 

आप किसी विशिष्ट डोमेन वस्तु का परीक्षण करने (अपने Fecha वर्ग के रूप में) की जरूरत है, तो आप: Grails सब काम करने के लिए आप :) के

एकीकरण परीक्षण के लिए आप कुछ इस तरह करते हैं माना जाता है शायद एक इकाई परीक्षण, कुछ इस तरह की जरूरत है:

package intertigre.test.domain 
import intertigre.domain.Fecha 
import intertigre.test.util.DomainFactoryTestService 
import grails.test.mixin.TestFor 
import grails.test.mixin.Mock 
import spock.lang.Specification 

@TestFor(Fecha) 
@Mock([OtherObject1, OtherObject2]) 
class FechaSpec extends Specification { 

def domainFactoryTestService // same thing here, if you need the service 

def 'test'() { 
    given: 
     def fecha = new Fecha() 
    and: 
     def oo1 = new OtherObject1() 
    when: 
     // ... 
    then: 
     // .... 
} 

आप सेवाओं का परीक्षण करने के साथ ही इकाई परीक्षण का उपयोग कर सकते हैं, यह क्या आप -इस सेवा-या एक "स्थिति" एक वर्ग परीक्षण करने के लिए (जा रहे हैं पर निर्भर करता है - जिस तरह से सेवा का उपयोग किया जाता है-)।

Ps। बेशक, यहां इस कोड का परीक्षण नहीं किया गया है और इसमें टाइपो शामिल हो सकते हैं। :) लेकिन मुझे आशा है कि आपको परीक्षण करने के तरीके के बारे में मेरा मुद्दा मिल जाएगा।

+0

मैं वास्तव में इंटीग्रेशनस्पेक के बजाय विशिष्टता विस्तार कर रहा हूं। java.lang.NullPointerException:। Grails.plugin.spock.IntegrationSpec पर अशक्त वस्तु \t पर प्राप्त नहीं कर सकता संपत्ति 'mainContext' $ जब मैं IntegrationSpec विस्तार करने के लिए बदलने की कोशिश, मैं जब परीक्षण चलाने के निम्नलिखित अपवाद spock_initializeSharedFields (IntegrationSpec.groovy) –

+0

आपको एकीकरण परीक्षण करते समय इंटीग्रेशनस्पेक का विस्तार करना चाहिए https://code.google.com/p/grails-spock-examples/wiki/Overview#Integration_tests क्या कोई बिंदु है जहां आप उस संक्षिप्त मुख्य कॉन्टेक्स्ट को घोषित करते हैं ? वर्तमान में आप किस स्पॉक प्लगइन का उपयोग कर रहे हैं? क्या आप एक नज़र डालने के लिए कोड का एक टुकड़ा जोड़ सकते हैं? – lucke84

+0

मैं प्लगइन का उपयोग कर रहा हूं ": स्पॉक: 0.6"। मैं मुख्य रूप से mainContext को एक चर के रूप में घोषित नहीं करता हूं। मैंने अपने टेस्ट कोड –

1

ऊपर स्वीकृत उत्तर नियंत्रकों के यूनिट परीक्षणों के लिए अच्छा है जिन्हें सेवा कक्षाओं को इंजेक्शन की आवश्यकता होती है।

यदि आपने संसाधनों में अन्य वसंत प्रबंधित बीन्स को परिभाषित किया है।ग्रूवी और उन्हें जरूरत है कि आप अपने कल्पना वर्ग के शीर्ष पर यह पंक्ति जोड़ सकते इंजेक्शन

static loadExternalBeans = true //<-- loads resources.groovy beans 

स्रोत: http://grails.github.io/grails-doc/2.4.4/guide/testing.html#unitTesting

एक इकाई परीक्षण वर्ग के लिए स्थिर loadExternalBeans = true क्षेत्र परिभाषा जोड़ना Grails बनाता है यूनिट टेस्ट रनटाइम Grails-app/conf/spring/resource.groovy और grails-app/conf/spring/resource.xml फ़ाइलों से सभी बीन परिभाषाओं को लोड करता है।

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