2012-10-09 16 views
10

मैं एक एकीकरण परीक्षण लिख रहा हूं जहां स्टार्टअप के दौरान एक अनुप्रयोग संदर्भ xml प्रारंभ किया गया है। टेस्ट क्लास में कई टेस्ट विधियां हैं जो एक विशिष्ट बीन 'एक्स' (पहले से ही एक्सएमएल में परिभाषित) का उपयोग करती हैं। मेरी वास्तविक आवश्यकता केवल परीक्षण विधियों में से एक के लिए बीन एक्स का नकल करना है।एक संदर्भ में वसंत बीन को किसी अन्य संदर्भ से नकली संस्करण के साथ बदलें

एक परीक्षण विधि के अंदर: मैंने क्लासपाथएक्सएमएलप्लिकेशन कॉन्टेक्स्ट का उपयोग करके एक अलग एप्लिकेशन संदर्भ बनाने की कोशिश की, केवल नकली बीन 'एम' के साथ।

अब मैं दो आवेदन संदर्भ (एसी): परीक्षण का मामला स्टार्टअप के दौरान बनाया 1. एक और (जो वास्तविक सेम एक्स शामिल हैं) 2. एक परीक्षा पद्धति के भीतर ClassPathXMLApplicationContext का उपयोग कर (जो नकली सेम एम है बनाया)।

मैं एसी: 2 से नकली बीन परिभाषा 'एम' का उपयोग करके एसी: 1 के भीतर वास्तविक बीन परिभाषा 'एक्स' को प्रतिस्थापित करना चाहता हूं।

क्या कोई इस पर कुछ प्रकाश डाल सकता है?

उत्तर

16

रीफ्रेश किए गए ApplicationContext में एक बीन को प्रतिस्थापित करने का कोई स्पष्ट तरीका नहीं है जब तक कि आप इसे बंद न करें और इसे फिर से ताज़ा करें।

इसे अनुकरण करने के लिए, सामान्य दृष्टिकोण बीन के Proxy का उपयोग करना है जिसे आप प्रतिस्थापित करना चाहते हैं और रनटाइम पर लक्ष्य बदलना चाहते हैं।

आप इसे आसानी से ढांचा aop समर्थन वर्गों का उपयोग कर सकते हैं:

<bean id="realBean" class="RealClass" /> 
<bean id="mockBean" class="MockClass" /> 
<bean id="targetSource" class="org.springframework.aop.target.HotSwappableTargetSource"> 
    <constructor-arg ref="realBean>" /> 
</bean> 

<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean> 
    <property name="targetSource" ref="targetSource" /> 
</bean> 

 

@Test 
public void testWithMockBean() { 
Object real = targetSource.swap(mock); 
.... 
// do your test work 
... 
targetSource.swap(real); 

} 
23

आप कर सकते हैं:

  • Profile एनोटेशन उपयोग करें यदि आप वसंत 3.1 है।
  • वसंत संदर्भ

में Primary एनोटेशन

  • उपयोग qualifiers
  • तार सेम खुद का उपयोग करें और मुझे यकीन है कि वहाँ और भी विकल्प हैं हूँ।

  • +0

    प्राथमिक मैं वास्तव में क्या ढूंढ रहा था। उसके लिए धन्यवाद! – daniel

    +2

    ** @ प्राथमिक ** सबसे अच्छा जवाब है: "इंगित करता है कि एक सेम को वरीयता दी जानी चाहिए जब कई उम्मीदवार ऑटोवायर (...)" – jsosnowski

    +0

    मेरे लिए \ @ प्राथमिक भी सबसे अच्छा जवाब है, लेकिन क्या होता है जब \ @Qualifier का उपयोग किया जाता है? – deFreitas

    3

    <beans> 
        <import resource="classpath*:appContext.xml" /> 
        <bean id="mockbeanOfX" class=....../> 
    </beans> 
    

    के साथ एक testApplicationContext बनाएं और फिर अपने testcase में इस परीक्षण के आवेदन संदर्भ लोड। अब आप आवेदन संदर्भ से नकली बीन प्राप्त कर सकते हैं और इसे आवश्यक चार्जर पास कर सकते हैं।

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