2012-09-21 24 views
8

स्प्रिंग 3.1.2, जुनीट 4.10.0 का उपयोग कर ऑटोवॉयरिंग काम नहीं कर रहा है, और दोनों संस्करणों के लिए बिल्कुल नया है। मुझे समस्या है कि मुझे काम करने के लिए एनोटेशन-आधारित ऑटोवायरिंग नहीं मिल सकती है।स्प्रिंग 3.1.2, जुनीट 4.10.0

नीचे दो नमूने हैं, जो एनोटेशन का उपयोग नहीं कर रहे हैं, जो ठीक काम कर रहा है। और दूसरा एनोटेशन का उपयोग कर रहा है, जो काम नहीं करता है, और मुझे कारण नहीं मिला है। मैंने वसंत-एमवीसी-टेस्ट के नमूने का बहुत कुछ पालन किया।

कार्य:

package com.company.web.api; 
// imports 

public class ApiTests { 

    @Test 
    public void testApiGetUserById() throws Exception { 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("/com/company/web/api/ApiTests-context.xml"); 
     UserManagementService userManagementService = (UserManagementService) ctx.getBean("userManagementService"); 
     ApiUserManagementController apiUserManagementController = new ApiUserManagementController(userManagementService); 
     MockMvc mockMvc = standaloneSetup(apiUserManagementController).build(); 

     // The actual test  
     mockMvc.perform(get("/api/user/0").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()); 
    } 
} 

असफल, क्योंकि userManagementService रिक्त है, autowired हो रही नहीं:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration  // should default to ApiTests-context.xml in same package 
public class ApiTests { 

    @Autowired 
    UserManagementService userManagementService; 

    private MockMvc mockMvc; 

    @Before 
    public void setup(){ 
     // SetUp never gets called?! 
    } 

    @Test 
    public void testGetUserById() throws Exception { 

     // !!! at this point, userManagementService is still null - why? !!!  

     ApiUserManagementController apiUserManagementController 
      = new ApiUserManagementController(userManagementService); 

     mockMvc = standaloneSetup(apiUserManagementController).build(); 

     // The actual test 
     mockMvc.perform(get("/api/user/0").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()); 
    } 
} 

ध्यान दें कि दोनों परीक्षण वर्गों ऊपर उसी संदर्भ विन्यास का उपयोग करना चाहिए, और उपयोगकर्ता प्रबंधन सेवा को वहां परिभाषित किया गया है।

ApiTests-context.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" 
     xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:jee="http://www.springframework.org/schema/jee" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
      http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <property name="url" value="jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=utf8"/> 
     <property name="username" value="user"/> 
     <property name="password" value="passwd"/> 
    </bean> 

    <!-- Hibernate SessionFactory --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" 
      p:dataSource-ref="dataSource" p:mappingResources="company.hbm.xml"> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
       <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> 
      </props> 
     </property> 
     <property name="eventListeners"> 
      <map> 
       <entry key="merge"> 
        <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/> 
       </entry> 
      </map> 
     </property> 
    </bean> 

    <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
      p:sessionFactory-ref="sessionFactory"/> 

    <!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= --> 

    <context:annotation-config/> 
    <tx:annotation-driven/> 
    <context:mbean-export/> 

    <!-- tried both this and context:component-scan --> 
    <!--<bean id="userManagementService" class="com.company.web.hibernate.UserManagementServiceImpl"/>--> 
    <context:component-scan base-package="com.company"/> 

    <!-- Hibernate's JMX statistics service --> 
    <bean name="application:type=HibernateStatistics" class="org.hibernate.jmx.StatisticsService" autowire="byName"/> 

</beans> 

और UserManagementService (इंटरफेस) के साथ-साथ UserManagementServiceImpl @Service एनोटेशन है।

दो मामूली प्रश्न/टिप्पणियां: सेटअप() कभी भी कॉल नहीं किया जाता है, भले ही इसे @ टिप्पणी से पहले रखा गया हो। इसके अलावा, मैंने देखा है कि अगर वे 'टेस्ट' नाम से शुरू नहीं होते हैं, तो मेरी टेस्ट विधियों को निष्पादित/मान्यता प्राप्त नहीं किया जाता है, जो मामला नहीं है, हालांकि मैंने देखा कि सभी वसंत-एमवीसी-टेस्ट नमूने के साथ।

pom.xml:

<dependency> 
     <groupId>org.junit</groupId> 
     <artifactId>com.springsource.org.junit</artifactId> 
     <version>4.10.0</version> 
     <scope>test</scope> 
    </dependency> 

enter image description here

अद्यतन:

समस्या केवल तब होता है जब मैं Maven से परीक्षण चलाने; यह ठीक है जब मैं अपने आईडीई (इंटेलिजे आईडीईए) के भीतर से परीक्षण चलाता हूं।

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.12.3</version> 
      <configuration> 
       <includes> 
        <include>**/*Tests.java</include> 
       </includes> 
      </configuration> 
     </plugin> 
+0

अगर आप एक explicite नामित विन्यास फाइल '@ContextConfiguration (" classpath साथ एनोटेशन शैली का उपयोग क्या: कॉम/कंपनी/वेब/API/ApiTests -context.xml ")' – Ralph

+2

कृपया पूर्ण संदर्भ पोस्ट करें। अपने पोम को भी पोस्ट करें क्योंकि ऐसा लगता है जैसे आप जूनिट 3 का उपयोग कर रहे हैं? – MikePatel

+0

@ राल्फ ने इसे पहले से ही कोशिश की, कोई फर्क नहीं पड़ता। @Context कॉन्फ़िगरेशन (स्थान = {"कक्षापाथ: कंपनी/कॉम/वेब/एपीआई/एपीटीस्ट्स-संदर्भ.एक्सएमएल"}) –

उत्तर

6

ऑटोवायरिंग तब तक नहीं होगा जब तक आप एक घटक स्कैन नहीं करते।

आपने इसे अपने कोड में क्यों टिप्पणी की है?

<!--<context:component-scan base-package="com.company"/>--> 

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

संपादित करें: ठीक है मैंने अभी आपकी कॉन्फ़िगरेशन की जांच की है और इसे इस तरफ काम करने में सक्षम था।मेरा एकमात्र अनुमान यह हो सकता है कि आप इसे किसी भी तरह से खराब परीक्षण धावक के साथ चला रहे हैं जो इसे गलत जूनिट का उपयोग कर रहा है।

संपादित 2 (सॉल्व): तो यह पता चला है कि समस्या यह है क्योंकि आप जूनिट के कस्टम संस्करण का उपयोग कर रहे हैं। Surefire प्रदान की गई जूनिट लाइब्रेरी की तलाश करता है और इसे नहीं ढूंढ सकता। नतीजतन यह जूनिट 3 के लिए डिफ़ॉल्ट है, जो आपके ऐप को कॉन्फ़िगरेशन लोड करने के कारण बनता है।

आप explictly

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.12.3</version> 
    <dependencies> 
     <dependency> 
     <groupId>org.apache.maven.surefire</groupId> 
     <artifactId>surefire-junit47</artifactId> 
     <version>2.12.3</version> 
     </dependency> 
    </dependencies> 
    </plugin> 

तरह कस्टम प्रदाता निर्दिष्ट कर सकते हैं लेकिन मैं ने पाया है कि यह कस्टम रेपोस साथ अच्छी तरह से काम नहीं करता। यदि संभव हो तो मैं जूनिट के मानक संस्करण का उपयोग करने का सुझाव दूंगा।

+0

मैंने घटक-स्कैन दोनों के साथ-साथ मैन्युअल रूप से बीन डालने का परीक्षण किया था। <बीन आईडी = "उपयोगकर्ता प्रबंधन सेवा" वर्ग = "com.company.web.hibernate.UserManagementServiceImpl" /> क्या ऐसा वही नहीं होगा? लेकिन वैसे भी, न तो तरीका काम करता है, जब भी मैं घटक-स्कैन का उपयोग करता हूं। मैं ग्रहण में नहीं हूं, मैं इंटेलिजे आईडीईए में हूं। एक निर्भरता पेड़ भी है, और यह मुझे org.junit दिखा रहा है: com.springsource.org.junit: 4.10.0 –

+0

मैंने उपरोक्त प्रश्न/कोड को घटक-स्कैन में बदल दिया है (अब और टिप्पणी नहीं की गई है)। जैसा कि बताया गया है, मैंने पहले भी कोशिश की है, लेकिन अभी भी कोई सफलता नहीं है)। –

+0

मैं SpringJUnit4ClassRunner का उपयोग करता हूं - क्या आपका मतलब है? यह हर जगह उपयोग करता है http://rstoyanchev.github.com/spring-31-and-mvc-test/#26 –

0

विशिष्ट संदर्भ कॉन्फ़िगरेशन आज़माएं, उदा।

@ContextConfiguration(locations = {"/file1.xml", "/file2.xml" }) 

(सिर्फ दिखा कि यह कैसे जब जरूरत से अधिक फ़ाइलों के साथ प्रयोग किया जा सकता है - एक पर्याप्त हो सकता है)

संपादित करें: यहाँ उल्लेख के रूप में आप AutowiredAnnotationBeanPostProcessor सक्षम है? http://www.mkyong.com/spring/spring-auto-wiring-beans-with-autowired-annotation/

+0

कोशिश की, कोई फर्क नहीं पड़ता, ऊपर अद्यतन प्रश्न देखें। –

0

मुझे यह समस्या थी। मेरा @Autowire मेरे आईडीई (स्प्रिंगसोर्स एसटीएस) के भीतर काम करेगा, लेकिन जब मैं कमांड लाइन से निर्माण करने के लिए मेवेन का उपयोग कर रहा था तो एप्लिकेशन संदर्भ लोड करने में असफल रहा।

यह समस्या pom.xml में मेरी निर्भरताओं के साथ थी। मैं जुनीट के वसंत संस्करण का उपयोग कर रहा था जिससे त्रुटि हुई। मुझे लगता है कि यह मूल पोस्ट का मूल कारण है। मुझे काम करने के लिए किसी भी मेवेन प्लगइन को कोड करने की ज़रूरत नहीं थी।

मैं

<dependency> 
    <groupId>org.junit</groupId> 
    <artifactId>com.springsource.org.junit</artifactId> 
    <version>4.7.0</version> 
</dependency> 

बदल

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.10</version> 
</dependency>