2013-05-30 8 views
6

के बाद वसंत संदर्भ गंदे मैंने हाल ही में अपने वर्तमान प्रोजेक्ट पर एक फ्रीलांसर के रूप में शुरू किया। जिस चीज में मैंने खुद को फेंक दिया, वह असफल जेनकिन्स बिल्ड था (यह 8 अप्रैल से शुरू होने में विफल रहा था, एक सप्ताह पहले मैंने शुरू किया था)।प्रत्येक एकीकरण परीक्षण

आम तौर पर, आप लॉग में DI मुद्दों का एक बटलोड देख सकते हैं। मैंने पहली चीज को उसी एप्लिकेशन संदर्भ से शुरू करने के लिए सभी तरह के परीक्षणों को काम करने के लिए प्राप्त किया था। उन्होंने अपनी "मॉकिंग" चीज भी लागू की, जो सही ढंग से काम करने में असफल रहा। लीड देव के साथ चर्चा के बाद, मैंने स्प्रिंगॉकिटो का उपयोग शुरू करने का सुझाव दिया। (एक निश्चित मॉड्यूल के लिए, उन्हें अपने एकीकरण परीक्षण के लिए मॉकिंग की आवश्यकता थी - विरासत कारणों, जिन्हें बदला नहीं जा सकता)

वैसे भी, सामान उसके बाद बुरी तरह विफल रहा। परीक्षण में मजाक किए गए बहुत से सेम, बस मजाक नहीं किए गए थे, या पाए गए या जो भी नहीं थे। आम तौर पर, यह एप्लिकेशन संदर्भ की लोडिंग पर असफल हो जाता है, यह बताते हुए कि एक या एक और बीन गायब था।

मैंने अलग-अलग सामान और विभिन्न दृष्टिकोणों की कोशिश की, लेकिन अंत में, केवल वही चीज़ जो मुझे सबसे ज्यादा डरती थी वह काम करेगी: प्रत्येक एकल परीक्षण में @DirtiesContext जोड़ें। अब, मेवेन बिल्ड फिर से हरे रंग की बारी शुरू कर रहा है, परीक्षण करना शुरू कर रहा है जो उन्हें करना है। लेकिन मैं प्रत्येक बार वसंत संदर्भ पुनः लोड कर रहा हूं, जिसमें समय लगता है - जो सभी सापेक्ष है, क्योंकि संदर्भ लगभग 1 - 2 सेकंड में लोड होता है।

इस कहानी के लिए एक साइड नोट यह है कि उन्होंने हाइबरनेट 4 में अपग्रेड किया है, और इस प्रकार स्प्रिंग 3.2 में। पहले, वे स्प्रिंग 3 के पुराने संस्करण का उपयोग कर रहे थे। सभी परीक्षण तब वापस काम कर रहे थे, और @DirtiesContext चीज़ जरूरी नहीं थी।

अब, मुझे सबसे ज्यादा चिंता क्या है, यह है कि मैं तुरंत इस अजीब व्यवहार के लिए स्पष्टीकरण के बारे में सोच नहीं सकता। ऐसा लगता है कि स्प्रिंग्स संदर्भ गंदे है, बस एक परीक्षण शुरू करके जो @Autowired सेम का उपयोग करता है। सभी परीक्षण मोक्स का उपयोग नहीं कर रहे हैं, इसलिए यह नहीं हो सकता है। क्या यह ध्वनि किसी से परिचित है? क्या किसी के पास वसंत के नवीनतम संस्करण (एकीकरण) के साथ एकीकरण अनुभव के साथ समान अनुभव हैं?

Stackoverflow पर, मैं इस टिकट मिल गया है: How can a test 'dirty' a spring application context? यह बहुत ज्यादा व्यवहार मैं दिखाई दे रही है योग अप करने के लिए लगता है, लेकिन मुद्दा यह है कि हम autowiring रहे हैं सेवाओं/खजाने/..., और है कि हम उन वर्गों पर कोई भी सेटर्स नहीं है।

कोई विचार?

धन्यवाद!

+0

मैं वसंत परीक्षण संदर्भों का उपयोग नहीं कर रहा हूं जो अत्यंत (अभी तक) क्योंकि मेरे सभी परीक्षण संदर्भ को डालने नहीं कर रहे हैं। मुझे यह भी पता नहीं था कि संभव है;) वसंत 3.2, हाइबरनेट 4.2। क्या यह हो सकता है कि कुछ पोस्टप्रोसेसर लात मार रहे हों? कुछ बीन परिभाषाएं दो स्टार्टअप के बीच बदल रही हैं और ऑटोवायरिंग नए सेमों और इस प्रकार गंदे निशान को हल कर रही है? संभवतः –

+0

। मैं पोस्टप्रोसेसरों को दिमाग में रखूंगा, धन्यवाद! अभी, मैं संदर्भ के लिए लोडर को समझने की कोशिश कर रहा हूं। जब आप स्प्रिंगॉकिटो का उपयोग कर रहे हैं, तो आपको एक संदर्भ लोडर के रूप में SpringockitoContextLoader.class होना चाहिए - हालांकि, मैं हर जगह उस संदर्भ लोडर का उपयोग नहीं कर रहा हूं, जो स्पष्टीकरण हो सकता है। यह समझाएगा कि क्यों वसंत कुछ बीन्स नहीं ढूंढ सकता है जो ढांचे को पिछले परीक्षण में लोड किया गया है। – gjoris

उत्तर

4

मेरे अपने प्रश्न का उत्तर देने के लिए, रहस्य वसंत संस्करण में था। हम वसंत 3.1.3 का उपयोग कर रहे थे, जबकि मुझे लगता है कि वे वसंत 3.2 का उपयोग कर रहे थे (वे लगातार वसंत संस्करण के हालिया अपग्रेड के बारे में बात कर रहे थे)।

स्पष्टीकरण यहाँ था, एक ब्लॉग पोस्ट मैं अपने शिकार में अधिक ठोकर खाई को मिल यह तय: http://blog.springsource.org/2012/11/07/spring-framework-3-2-rc1-new-testing-features/

और प्रासंगिक टुकड़ा की एक कॉपी पेस्ट:

में सामान्य कारखाने तरीकों का उपयोग स्प्रिंग कॉन्फ़िगरेशन किसी भी तरह से परीक्षण के लिए विशिष्ट नहीं है, लेकिन सामान्य कारखाने के तरीके जैसे EasyMock.createMock (MyService.class) या Mockito.mock (MyService.class) अक्सर स्प्रिंग बीन्स के लिए गतिशील मैक्स बनाने के लिए उपयोग किया जाता है> परीक्षण अनुप्रयोग संदर्भ में । उदाहरण के लिए, स्प्रिंग फ्रेमवर्क 3.2 से पहले निम्न> कॉन्फ़िगरेशन ऑर्डर सेवा में ऑर्डर रिपॉजिटरी को स्वत: करने में विफल हो सकता है। इसका कारण यह है कि, उस क्रम के आधार पर जिसमें आवेदन संदर्भ में बीन्स शुरू किए गए हैं,> वसंत संभावित रूप से ऑर्डर रिपॉजिटरी बीन को com.example के बजाय java.lang.Object> होने का अनुमान लगाएगा।repository.OrderRepository।

तो, मैंने इस समस्या को कैसे हल किया?

  • बाहर परीक्षण जो मजाक की जरूरत के लिए एक नया Maven मॉड्यूल
  • फ़िल्टर बनाएं: ठीक है, मैं निम्नलिखित चरणों का किया था। सभी गैर-मॉक किए गए परीक्षण स्प्रिंग बिल्ड में सामान्य रूप से चलेंगे, एक अलग Failsafe रन में (मैंने बेस-पैकेज "साफ" बनाया है, और उन्हें इस तरह से हल किया है)
  • सभी मॉक किए गए परीक्षण को मूल पैकेज में रखें "मजाक", और नकली परीक्षणों के लिए Failsafe में एक अतिरिक्त रन बनाते हैं।
  • प्रत्येक मॉक परीक्षण मोक्स बनाने के लिए स्प्रिंगॉकिटो का उपयोग कर रहा है। मैं स्प्रिंगॉकिटो एनोटेशन का भी उपयोग कर रहा हूं, आसानी से @ReplaceWithMock जगह पर कर सकता हूं। प्रत्येक मॉक टेस्ट को तब @DirtiesContext के साथ एनोटेट किया जाता है, इसलिए संदर्भ प्रत्येक परीक्षण के बाद गंदे होते हैं, और वसंत संदर्भ प्रत्येक परीक्षण के साथ पुन: उत्पन्न होता है।

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

इस रणनीति का उपयोग करके, मुझे बिल्ड अप और फिर से चल रहा है, और सभी परीक्षण ठीक चल रहे हैं। यह सही नहीं है, लेकिन यह काम कर रहा है, और यह लगातार है।

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