2011-12-14 11 views
54

हमारे पास जुनीट परीक्षण मामलों (एकीकरण परीक्षण) का एक गुच्छा है और वे तर्कसंगत रूप से विभिन्न परीक्षण कक्षाओं में समूहित हैं।जूनिट टेस्ट कक्षाओं में वसंत आवेदन संदर्भ का पुन: उपयोग करें

हम परीक्षण प्रति कक्षा एक बार वसंत आवेदन संदर्भ लोड करने के लिए और के रूप में http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.html

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

एफडब्ल्यूआईडब्ल्यू, हम वसंत 3.0.5, जुनीट 4.5 का उपयोग करते हैं और परियोजना बनाने के लिए मेवेन का उपयोग करते हैं।

+0

नीचे दिए गए उत्तर की सभी महान हैं, लेकिन मैं एक context.xml नहीं है http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management ("context hierarchy" के लिए खोज)। क्या मैंने विस्मरण में अपना रास्ता बताया है? Context.xml के बिना ऐसा करने का कोई तरीका? – markthegrea

उत्तर

67

हां, यह पूरी तरह से संभव है। इसलिए एक ही locations दूसरी बार के लिए प्रदर्शित होता है, वसंत उसी संदर्भ बल्कि बनाने की तुलना में उपयोग करता locations विशेषता के आधार पर

@ContextConfiguration(locations = "classpath:test-context.xml") 

स्प्रिंग कैश आवेदन संदर्भों: आपको बस इतना करना है अपने परीक्षण की कक्षाओं में एक ही locations विशेषता का उपयोग करने के लिए है एक नया।

मैंने इस सुविधा के बारे में एक लेख लिखा: Speeding up Spring integration tests। इसके अलावा स्प्रिंग प्रलेखन में विवरण में वर्णित है: 9.3.2.1 Context management and caching

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

+0

आह! उसे एहसास नहीं हुआ। हम लंबे समय से इस दृष्टिकोण का पालन कर रहे हैं और मैंने (गलती से) परीक्षण परीक्षा के लिए लंबी अवधि के लिए प्रत्येक टेस्ट क्लास के साथ वसंत संदर्भ लोडिंग के लिए जिम्मेदार ठहराया है। सावधानीपूर्वक जांच लेंगे। धन्यवाद। – Ramesh

+0

मैं कहूंगा कि वसंत को आपके टेस्टकेस के निष्पादन आदेश के बारे में कोई जानकारी नहीं है। इसके परिणामस्वरूप यह नहीं बता सकता कि संदर्भ बाद में आवश्यक है या इसे निपटाया जा सकता है। – philnate

+1

मुझे नहीं लगता कि यह वास्तव में कैसे सच हो सकता है। एक्लिप्स/जुनीट हर बार जब मैं रन/जुनीट टेस्ट करता हूं तो पर्यावरण को क्रैंकिंग करने में 2 मिनट खर्च करता है। यह तब नहीं होगा जब कुछ भी कैश किया गया हो। – user1944491

22

वसंत 3.2.2 के रूप में Tomasz Nurkiewicz's answer को जोड़ने के लिए, @ContextHierarchy एनोटेशन अलग, संबद्ध एकाधिक संदर्भ संरचना के लिए इस्तेमाल किया जा सकता है। यह सहायक होता है जब एकाधिक टेस्ट क्लास साझा करना चाहते हैं (उदाहरण के लिए) मेमोरी डेटाबेस सेटअप (डेटासोर्स, एंटीटी मैनेजर फैक्ट्री, टीएक्स मैनेजर इत्यादि)।

उदाहरण के लिए

:

@ContextHierarchy({ 
    @ContextConfiguration("/test-db-setup-context.xml"), 
    @ContextConfiguration("FirstTest-context.xml") 
}) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class FirstTest { 
... 
} 

@ContextHierarchy({ 
    @ContextConfiguration("/test-db-setup-context.xml"), 
    @ContextConfiguration("SecondTest-context.xml") 
}) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class SecondTest { 
... 
} 

इस सेटअप संदर्भ का उपयोग करता है "परीक्षण-db-सेटअप-context.xml" केवल एक बार अंदर यह व्यक्तिगत इकाई परीक्षण के लिए इंजेक्ट किया जा सकता बनाया जाएगा, लेकिन सेम होने से संदर्भ पुस्तिका पर

अधिक:

+0

मेरे पास बहु-मॉड्यूल मैवेन है, और मैं सेवा मॉड्यूल में डेटाबेस सेटअप से बचने की कोशिश करता हूं (क्योंकि यह डेटाकैस मॉड्यूल के परीक्षणों से पहले ही लोड हो चुका है) और यह मेरे लिए काम नहीं करता है! –

+2

यह मेरे लिए काम किया! धन्यवाद। बस स्पष्ट होने के लिए, @ContextHierarchy एनोटेशन के बिना, वसंत प्रत्येक परीक्षण के लिए मेरे डीबी लोड करता है। मैं "कक्षाएं" परम का उपयोग कर रहा हूं: @ContextConfiguration (कक्षा = {JpaConfigTest.class, ... – Brel

+4

कोई विचार अगर यह संदर्भ परिभाषा के लिए एक्सएमएल का उपयोग करने के बजाय एनोटेशन के माध्यम से पूरी तरह से किया जा सकता है? मैंने बहुत कुछ खोजा है यह दस्तावेज़ में और यहां SO पर है लेकिन मुझे ऐसा कुछ भी नहीं मिला जो मुझे लगता है कि यह संभव नहीं है। –