2011-11-09 13 views
6

वसंत/JUnit में आप का उपयोग कर @ContextConfiguration ऐसेरनटाइम पर गतिशील रूप से वसंत संदर्भ कॉन्फ़िगरेशन जोड़ना?

@ContextConfiguration({"classpath:a.xml", "classpath:b.xml"}) 

के रूप में मैं एक आवश्यकता यदि मुझे परीक्षण वर्ग पर एक विशेष एनोटेशन दिखाई दे जहां तो गतिशील रूप से एक और XML संदर्भ फ़ाइल जोड़ने के लिए आवेदन संदर्भ फ़ाइलें लोड कर सकते हैं। उदाहरण के लिए:

@ContextConfiguration({"classpath:a.xml", "classpath:b.xml"}) 
@MySpecialAnnotation 
class MyTest{ 
... 
} 

ऊपर के उदाहरण में मैं @MySpecialAnnotation के लिए देखो और special-context.xml भी जोड़ना होगा। इसे करने का बेहतरीन तरीका क्या है? मैंने इसे थोड़ी देर के लिए देखा है और ऐसा लगता है कि यह ContextLoader उप-वर्गीकरण जैसा है जो @ContextConfiguration के मानकों में से एक है सबसे अच्छा तरीका है? क्या ये सही है? क्या ऐसा करने के लिए इससे अच्छा तरीका है?

+0

आप गतिशील से क्या मतलब है। एक एनोटेशन स्थिर है, यदि ऐसा नहीं होता है रनटाइम पर बदलें? – Ralph

+0

स्पष्ट रूप से वह समस्या है जिसे मैं हल करने की कोशिश कर रहा हूं। मैं गतिशील रूप से वसंत भार वाली फ़ाइलों की सूची में एक नया संदर्भ जोड़ना चाहता हूं। –

+0

लेकिन उस एनोटेशन का अर्थ क्या है? "अब संदर्भ x जोड़ें" को ट्रिगर करना चाहिए? – Ralph

उत्तर

2

यह सबसे अच्छा समाधान पता चला है बनाने के लिए अपने ही ContextLoader। मैं सार एक विस्तार करके ऐसा किया।

public class MyCustomContextListener extends GenericXmlContextLoader implements ContextLoader { 
    @Override 
    protected String[] generateDefaultLocations(Class<?> clazz) { 
     List<String> locations = newArrayList(super.generateDefaultLocations(clazz)); 
     locations.addAll(ImmutableList.copyOf(findAdditionalContexts(clazz))); 
     return locations.toArray(new String[locations.size()]); 
    } 

    @Override 
    protected String[] modifyLocations(Class<?> clazz, String... locations) { 
     List<String> files = newArrayList(super.modifyLocations(clazz, locations)); 
     files.addAll(ImmutableList.copyOf(findAdditionalContexts(clazz))); 
     return files.toArray(new String[files.size()]); 
    } 

    private String[] findAdditionalContexts(Class<?> aClass) { 
     // Look for annotations and return 'em 
    } 
} 
+0

चेक और सत्यापन को पार करने के लिए एक परीक्षण केस जोड़ने और बनाने के लिए कैसे करें (सूट नहीं, लेकिन परीक्षण केस की आवश्यकता है)? – Kathir

2

शायद आप इसे प्राप्त करने के लिए स्प्रिंग 3.1 Profiles का उपयोग कर सकते हैं।

आप एक प्रोफ़ाइल विशेष बुलाया में सेम विशेष context.xml में परिभाषित कर दिया है तो आप अपनी कक्षा पर @Profile ("विशेष) का उपयोग विशेष प्रोफ़ाइल सक्रिय कर सकते हैं।

यह अपने विशेष आवश्यकता को दूर करेंगे एनोटेशन पूरी तरह से।

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