2016-09-30 3 views
1

J'ai créé un test JUnit au printemps avec code suivant:printemps JUnit pas tout chargement applicationContext de XML

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
    "classpath:*/WEB-INF/demo-servlet.xml"}) 
public class CrudTestJUnit extends AbstractJUnit4SpringContextTests { 

    @Autowired 
    protected ShoppingCartDao shoppingCartDao; 

    @Autowired 
    private ApplicationContext context; 

    @Before 
    public void setUp(){ 

    } 

    @Test 
    public void testSomething() { 
     System.out.println("Evo beanvoa:" + Arrays.toString(context.getBeanDefinitionNames())); 
     Assert.assertTrue(false); 
    } 
} 

Dans démo-servlet.xml i défini haricot:

<bean id="shoppingCartDao" class="com.it355.hibernatecrud.dao.impl.ShoppingCartDaoImpl"></bean> 

Quand je lance test JUnit i obtenir cette erreur:

Error creating bean with name 'CrudTestJUnit': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected com.it355.hibernatecrud.dao.ShoppingCartDao CrudTestJUnit.shoppingCartDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.it355.hibernatecrud.dao.ShoppingCartDao] found for dependency: 

Quand je supprimer le panier je reçois ce billet depuis getBeanDefinitionNames():

Evo beanvoa:[org.springframework.context.annotation.internalConfigurationAnnotationProcessor, 
org.springframework.context.annotation.internalAutowiredAnnotationProcessor, 
org.springframework.context.annotation.internalRequiredAnnotationProcessor, 
org.springframework.context.annotation.internalCommonAnnotationProcessor, 
org.springframework.context.annotation.internalPersistenceAnnotationProcessor, 
org.springframework.context.event.internalEventListenerProcessor, 
org.springframework.context.event.internalEventListenerFactory, 
org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor, org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor] 

Voici mon fichier complet démo-servlet.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:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-4.0.xsd 
          http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
          http://www.springframework.org/schema/tx 
          http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <!--Kako bi Hibernate mogao da se poveže na bazu podataka potrebno je kreirati sesiju. To radimo u sledećem 
    zrnu--> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="configLocation" > 
      <!--Dodavanje path-a na kome se nalaze podešavanja za Hibernate --> 
      <value>classpath:hibernate.cfg.xml</value> 
     </property> 
     <!-- Dodavanje path-a paketa u kome se nalaze entity fajlovi na osnovu kojih 
     će Hibernate kreirati bazu i upisivati u nju--> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.it355.hibernatecrud.entity</value> 
      </list> 
     </property> 
    </bean> 

    <!--Transakcija se dešava između baze i programa korišćenjem Transaction Managera koji definišemo ovde 
    On koristi sesiju koju smo definisali iznad --> 
    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <bean id="shoppingCartDao" class="com.it355.hibernatecrud.dao.impl.ShoppingCartDaoImpl"></bean> 
    <bean id="persistenceExceptionTranslationPostProcessor" 
      class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

    <context:component-scan base-package="com.it355.hibernatecrud" /> 
    <mvc:annotation-driven conversion-service="conversionService" /> 
    <tx:annotation-driven /> 

    <mvc:default-servlet-handler /> 

    <mvc:resources mapping="/css/**" location="/WEB-INF/css/"/> 
    <mvc:resources mapping="/resources/**" location="/WEB-INF/" /> 
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> 
     <property name="converters"> 
      <set> 
       <bean class="com.it355.hibernatecrud.converter.IntegerToCategory" /> 
      </set> 
     </property> 
    </bean> 
    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/jsp/"></property> 
     <property name="suffix" value=".jsp"></property> 
    </bean> 

</beans> 

Suis-je tort d'appeler le fichier de configuration ou autre chose? Y a-t-il quelqu'un qui a eu le même problème?

Également dans mon fichier de configuration, j'ai scanné le composant et mon application fonctionne et charge les beans sans problème, mais JUnit pose un problème.

+0

Je pense que vous devriez utiliser l'annotation @RunWith ou étendre la classe de test Spring, pas les deux, essayez de supprimer la partie extends. –

+0

Je rencontre le même problème avec ou sans extension de la classe de test Spring –

+0

Ok, on dirait que la config ne devrait pas être dans WEB-INF, où elle ne peut pas être facilement accessible par tests unitaires, mais plutôt dans src/main/resources (ou src/test/resources si test seulement) et alors vous pouvez juste avoir @ContextConfiguration (locations = "/demo-servlet.xml") –

Répondre

0

En fin de compte, je trouve que la configuration du WEB-INF doit être chargé comme ceci:

@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/demo-servlet.xml"}) 
1

Il semble que votre fichier de configuration XML ne peut pas être trouvé ou chargé correctement, donc vous n'êtes pas capable de faire les injections correctement.

Je suggère simplement d'utiliser classpath, si votre fichier de configuration XML est dans votre CLASSPATH, il n'est pas nécessaire de mentionner WEB-INF etc '. Comme ceci:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:demo-servlet.xml") 
public class CrudTestJUnit extends AbstractJUnit4SpringContextTests { 
}