2010-08-05 6 views
13

मेरे एकीकरण परीक्षणों में से एक एकाधिक वसंत संदर्भ फ़ाइलों का उपयोग करता है। ऐसा लगता है कि स्प्रिंग केवल पहले संदर्भ से सेम में स्वायत्त है, न कि दूसरा। क्या किसी को पता है कि मैं क्या गलत कर रहा हूं या समस्या के आसपास कैसे काम करना है?वसंत को कई संदर्भों का उपयोग करके एकीकरण परीक्षण वर्ग को स्वचालित करने के लिए कैसे प्राप्त करें?

 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
     "classpath:/META-INF/spring/applicationContext.xml", 
     "classpath:/META-INF/spring/applicationContext-security.xml"}) 
@Configurable 
public class UserDetailsServiceImplIntegrationTest { 

    @Autowired 
    UserDataOnDemand dod; 
    // @Autowired does not work for this bean from applicationContext-security.xml 
    UserDetailsService userDetailsService; 

    @Before 
    public void setup() { 
     dod.init(); 
     // workaround for autowiring problem 
     userDetailsService = (UserDetailsService)ctx.getBean("userDetailsService"); 
    } 

    @Test 
    public void testLoadUser() { 
     UserDetails ud = userDetailsService.loadUserByUsername("[email protected]"); 
     Assert.assertEquals("[email protected]", ud.getUsername()); 
    } 
} 

मैं वसंत 3.0.3 का उपयोग कर रहा हूं।

यहाँ स्टैक ट्रेस जब मैं UserDetailsService के लिए @Autowired लाइन uncomment है:

 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'za.co.acme.app.security.UserDetailsServiceImplIntegrationTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.security.core.userdetails.UserDetailsService za.co.acme.app.security.UserDetailsServiceImplIntegrationTest.userDetailsService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.security.core.userdetails.UserDetailsService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1064) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:374) 
    at org.springframework.beans.factory.wiring.BeanConfigurerSupport.configureBean(BeanConfigurerSupport.java:140) 
    at org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect.configureBean(AnnotationBeanConfigurerAspect.aj:59) 
    at org.springframework.beans.factory.aspectj.AbstractDependencyInjectionAspect.ajc$afterReturning$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$2$1ea6722c(AbstractDependencyInjectionAspect.aj:89) 
    at za.co.acme.app.security.UserDetailsServiceImplIntegrationTest.(UserDetailsServiceImplIntegrationTest.java:25) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:202) 

सेम "नाम से" देखने के बाद से काम करता है निश्चित रूप से वहाँ है, और यह सही प्रकार की है।

+0

लॉग में कुछ भी? – Bozho

+0

मैंने एक स्टैक ट्रेस –

उत्तर

0

अपने xml में userDetailsService के लिए बीन का नाम क्या है? आपको बीन नाम के साथ @Qualifier एनोटेशन जोड़ने और संदर्भ में <qualifier> टैग डालने की आवश्यकता हो सकती है।

विषय पर Spring's documentation पर एक नज़र डालें।

+0

जोड़ा जो मैंने कोशिश की और बिना किसी किस्मत के @Resource का उपयोग करने का प्रयास किया। मेरे पास केवल एक उपयोगकर्ता डिस्प्ले सेवा बीन है इसलिए टाइप करके भी काम करना चाहिए। त्रुटि संदेश इंगित करता है कि सही प्रकार के साथ कोई बीन नहीं मिला। –

7

एक वर्कअराउंड एक नई एकल कॉन्फ़िगरेशन फ़ाइल बनाने के लिए है (चलिए इसे "test-config.xml" कहते हैं) जिसमें अनुप्रयोगContext.xml और applicationContext-security.xml दोनों शामिल हैं। फिर आप अपने परीक्षणों के भीतर इन विन्यासों का उपयोग कर सकते हैं।

परीक्षण configuration.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <import resource="classpath:/META-INF/spring/applicationContext.xml"/> 
    <import resource="classpath:/META-INF/spring/applicationContext-security.xml"/> 
</beans> 

UserDetailsServiceImplIntegrationTest.java:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("/test-configuration.xml") 
@Configurable 
public class UserDetailsServiceImplIntegrationTest { 
... 
} 
3

मैं एक समान सेटअप है और यह मेरे लिए ठीक काम कर रहा है।

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:/applicationContext-struts.xml", "classpath:/applicationContext.xml" }) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
@Transactional 
public abstract class BaseTests { 

मेरा अनुमान है कि समस्या आपकी परियोजना के सेटअप में है। क्या आप ग्रहण का उपयोग करते हैं? क्या यह संदर्भ फ़ाइलों को/bin फ़ोल्डर से या एक/src फ़ोल्डर से लोड करता है? क्या आपने निर्माण से "applicationContext-security.xml" को बाहर रखा था?

+0

वैसे तथ्य यह है कि UserDetailsService बीन कार्यों का मैन्युअल लुकअप इंगित करता है कि संदर्भ फ़ाइलों को वास्तव में ठीक से लोड किया जा रहा है। यह सिर्फ ऑटोवॉयरिंग हिस्सा है जो किसी कारण से काम नहीं कर रहा है। –

+0

धन्यवाद, यह मेरे लिए ठीक काम करता है। – Mythul

1

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

<context:annotation-config/> 

अब यह उन टिप्पणियों के लिए स्कैन करेगा। Annotation-based configuration

वर्गों की संख्या यह इतना स्कैन करने के लिए आप बेकार में कोई autowiring साथ संकुल स्कैन न करें की जरूरत है सीमित करने के लिए पर स्प्रिंग दस्तावेज़ देखें, इस जोड़ें:

<context:component-scan base-package="org.example"/> 

अधिक पर के लिए Auto-detecting components के लिये दस्तावेज देखें कि, साथ ही एक्सएमएल नेमस्पेस आपको उन टैग्स को संदर्भित करने के लिए जोड़ना होगा।

0

मुझे एक ही समस्या है। ऐसा लगता है कि असली UserDataOnDemand के बजाय एक प्रॉक्सी UserDataOnDemand है।

4

मुझे एक ही समस्या थी, समाधान की समस्या मेरी समस्या इंटरफेस के माध्यम से बीन का पर्दाफाश कर रही है। (मैं।ई) आपका संदर्भ बीन प्रकार इंटरफ़ेस इसके क्रियान्वयन वर्ग

आपके मामले में कंक्रीट क्लास UserDetailsService इसके इंटरफ़ेस के साथ संदर्भ बदलना चाहिए।

उदाहरण के लिए:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
     "classpath:/META-INF/spring/applicationContext.xml", 
     "classpath:/META-INF/spring/applicationContext-security.xml"}) 
@Configurable 
public class UserDetailsServiceImplIntegrationTest { 

    //modified code 
    @Autowired 
    IUserDetailsService userDetailsService; 

    //your test cases follows 

} 

नोट: मैं जानता हूँ कि यह अभ्यस्त एक समझदार समाधान हो, लेकिन अभी आजमाइए, मैं इस एक ही त्रुटि के कारण बहुत चिंतित है और अंत में मेरे संदर्भ और इसे बदल ठीक काम किया उम्मीद है कि यह आपके मुद्दे को हल करेगा।

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

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