2012-06-13 8 views
5

Grails सेवा का परीक्षण करने का सबसे अच्छा अभ्यास क्या है जो किसी अन्य सेवा पर निर्भर करता है? डिफ़ॉल्ट mixin सही ढंग से परीक्षण के अंतर्गत सेवा इंजेक्षन TestFor, उदाहरण के लिए:एकाधिक सेवाओं के साथ Grails एकीकरण परीक्षण

@TestFor(TopService) 
class TopServiceTests { 
    @Test 
    void testMethod() { 
     service.method() 
    } 
} 

लेकिन अगर TopService (सेवा) की मेरी उदाहरण एक और सेवा, InnerService की तरह पर निर्भर करता है:

class TopService { 
    def innerService 
} 

innerService नहीं होगा उपलब्ध, निर्भरता इंजेक्शन इस चर को भरने के लिए प्रतीत नहीं होता है। मुझे कैसे आगे बढ़ना चाहिए?

+0

अपने परीक्षण में 'ग्रोवीटेस्टकेस' को विस्तारित करने का प्रयास करें। –

उत्तर

8

एकीकरण परीक्षणों को @TestFor एनोटेशन का उपयोग नहीं करना चाहिए, उन्हें extend GroovyTestCase होना चाहिए। परीक्षण एनोटेशन केवल यूनिट परीक्षणों के लिए होते हैं (और एकीकरण परीक्षण में उपयोग किए जाने पर खराब व्यवहार होगा, खासकर @Mock एनोटेशन)। आप अब उन बुरे व्यवहारों में से एक देख रहे हैं।

आप GroovyTestCase का विस्तार यदि आप तो बस

def topService 

अपने परीक्षण के शीर्ष पर हो सकता है और चूंकि उन सभी निर्भरता इंजेक्शन के साथ इंजेक्शन प्राप्त करेंगे।

एक यूनिट टेस्ट केस के लिए, आप setUp विधि में अपनी सेवा में संबंधित सेवाओं के नए उदाहरण जोड़ना चाहते हैं। बस:

@TestFor(TopService) 
class TopServiceTests { 
    @Before public void setUp() { 
     service.otherService = new OtherService() 
    } 
    ... 
+0

धन्यवाद! अंततः मैंने इसे आपके स्पष्टीकरण के साथ समझा;) मैं http://stackoverflow.com/questions/2272677/dependency- इंजेक्शन-in-grails-Integration-tests "टिप्पणियों से थोड़ा गुमराह था, एकीकरण परीक्षण GrailsUnitTestCase का विस्तार नहीं करना चाहिए" । यकीन नहीं है कि मैं ग्रोवीस्टेस्टकेस और GrailsUnitTestCase के बीच मतभेदों को पूरी तरह से प्राप्त करता हूं ... – Wavyx

+1

सबसे बड़ा अंतर (जो लोगों को काटने से समाप्त होता है) यह है कि इकाई परीक्षण केस सेटअप और टीयरडाउन पर मेटा क्लास के साथ मजाक करने और गड़बड़ाने के तरीके में बहुत कुछ करता है। मॉकिंग ऐसा कुछ है जो एकीकरण परीक्षण की आवश्यकता नहीं है क्योंकि उन्हें पहले से ही वास्तविक चीजें इंजेक्शन मिल चुकी हैं। इसका यह भी अर्थ है कि जब एकीकरण परीक्षण खत्म होता है, तो यूनिट टेस्ट आंसू के लिए यह खराब है क्योंकि इसे मेटा क्लास (जैसे गतिशील जीओआरएम विधियों) में परिवर्तनों को हटाया जा सकता है और बाद में एकीकरण परीक्षण की उम्मीद है। –

1

मेरे पास एक ग्राहक पंजीकरण सेवा है और मेरा ग्राहक पंजीकरण सेवा पासवर्ड सेवा पर निर्भर करती है।

मेरी CustomerRegistrationService बस सामान्य है जैसे कि यह autowires:

class CustomerRegistrationService { 
    def passwordService 

मेरी CustomerRegistrationServiceTest में मेरे पास है:

@TestFor(CustomerRegistrationService) 
@Mock(Customer) 
class CustomerRegistrationServiceTests extends GrailsUnitTestMixin { 

    void setUp() { 
     mockService(PasswordService) 
    } 

तो जब मैं CustomerRegistrationService का परीक्षण, यह PasswordService उपयोग करने में सक्षम है

+1

धन्यवाद। दरअसल, मॉकिंग जाने का रास्ता प्रतीत होता है, लेकिन यूनिट-टेस्ट आईएमएचओ के लिए अधिक। एकीकरण परीक्षण के लिए मैं पूरी तरह से पर्यावरण का परीक्षण करना चाहता हूं। – Wavyx