IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

[Spring] Problème injection d'un repository dans un test unitaire JUnit


Sujet :

Spring Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut [Spring] Problème injection d'un repository dans un test unitaire JUnit
    Bonjour à tous,

    Afin d'approfondir mes connaissances sur Spring j'ai réalisé un petit exercice afin de mieux comprendre le fonctionnement de Spring Data JPA et ORM.
    Malheureusement je fais face à des difficultés (ou tant mieux, comme on dit c'est en faisant des erreurs qu'on apprend ).
    Lors du lancement de mon test unitaire, celui-ci echoue et eclipse m'affiche la stack suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.example.test.repository.PersonRepositoryTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.repository.PersonRepository com.example.test.repository.PersonRepositoryTest.personRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.repository.PersonRepository] 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:293)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1186)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:384)
    	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)
    	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
    	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:200)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:252)
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:254)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:217)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.repository.PersonRepository com.example.test.repository.PersonRepositoryTest.personRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.repository.PersonRepository] 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$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:509)
    	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:290)
    	... 26 more
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.repository.PersonRepository] 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.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1118)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:967)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:862)
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:481)
    	... 28 more
    Je comprend l'erreur, Spring ne trouve pas de définition d'un bean et du coup il ne peut pas instancier/creer un bean. D'après la documentation étant donnée que mon repo hérite de CrudRepository, Spring va être capable de créer à partir de mon interface une instance en fournissant l'implémentation des méthodes de CrudRepository, il n'y a donc pas besoin de creer un PersonRepositoryImpl et de lui mettre un @Repository ou un @Named.

    J'ai essayé de résoudre le problème en sur differents forums mais je ne vois pas d'ou vient problème.

    Je pense que cela viens de mon ApplicationContext.xml.

    ApplicationContext.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?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:jpa="http://www.springframework.org/schema/data/jpa"
    	xmlns:context="http://www.springframework.org/schema/context"
    	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-4.0.xsd
    		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
     
     
     
     
    	<!-- DataSource for the entityManagerFactory -->
    	<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
    		<property name="url" value="jdbc:mysql://localhost:3306/schoolDB" />
    		<property name="username" value="root" />
    		<property name="password" value="" />
    	</bean>
     
    	<context:component-scan base-package="com.example.*"/>
     
    	<!-- entityManagerFactory -->
    	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    		<property name="dataSource" ref="datasource" />
    		<property name="jpaProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                    <prop key="hibernate.hbm2ddl.auto">update</prop>
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.format_sql">true</prop>
                </props>
            </property>
    	</bean>
     
    	<!-- JPA transaction manager -->
    	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory"/>
        </bean>
     
     
        <jpa:repositories base-package="com.example.repository"></jpa:repositories>
     
    </beans>
    voici mon repo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface PersonRepository extends CrudRepository<Person, Long> {
     
    }
    et voici mon test unitaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations="classpath*: META-INF/ApplicationContext.xml")
    public class PersonRepositoryTest {
     
    	@Autowired
    	private PersonRepository personRepository;
     
     
    	@Test
    	public void shouldSavePersonEntity() {
     
    		//Given
     
    		Person person = new Person();
    		person.setFirstname("Alain");
    		person.setLastname("GUICHARD");
    		person.setEmail("guichard@gmail.com");
    		person.setPassword("1234");
    		person.setDead(false);
     
    		//When
     
    		person = personRepository.save(person);
     
    		//Then
     
    		assertNotNull(person);
     
    		System.out.println("person saved is : " + person.getId() + " : " + person.getFirstname());
    	}
     
    }
    je vous remercie par avance pour votre aide.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Après de nombreuses heures de recherche, j'ai trouvé pourquoi j'avais cette erreur. C'etait parce que dans mon pom.xml, j'avais une dépendance vers hibernate-core et une autre vers entity-manager, j'ai enlevé la dépendance vers hibernate-core.

    Par contre mon test echoue, il echoue parce que mon repo ne sauvegarde pas l'entité en BDD. Spring a bien creer une instance de PersonRepository mais celui-ci ne sauvegarde pas en base et je ne comprend pas pourquoi

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Citation Envoyé par wahhh Voir le message
    Après de nombreuses heures de recherche, j'ai trouvé pourquoi j'avais cette erreur. C'etait parce que dans mon pom.xml, j'avais une dépendance vers hibernate-core et une autre vers entity-manager, j'ai enlevé la dépendance vers hibernate-core.

    Par contre mon test echoue, il echoue parce que mon repo ne sauvegarde pas l'entité en BDD. Spring a bien creer une instance de PersonRepository mais celui-ci ne sauvegarde pas en base et je ne comprend pas pourquoi

    Les tests unitaires sont rollbackés par défaut.
    Ajouter
    pour commiter.

Discussions similaires

  1. Erreur tres bizarre dans un test unitaire
    Par BlueMagma dans le forum Django
    Réponses: 3
    Dernier message: 14/09/2011, 17h26
  2. [1.x] validateur dans un test unitaire
    Par Ontolingua dans le forum Symfony
    Réponses: 7
    Dernier message: 08/10/2010, 09h45
  3. [EasyMock] utilisation des mock dans les test unitaires.
    Par jeremieG dans le forum Tests et Performance
    Réponses: 7
    Dernier message: 16/07/2010, 17h10
  4. [XP] est-ce que "if" peut apparaitre dans un test unitaire?
    Par wl1979 dans le forum Méthodes Agiles
    Réponses: 3
    Dernier message: 14/08/2009, 19h59
  5. Calcul de la profondeur dans les tests unitaires
    Par alex.nd4 dans le forum Tests et Performance
    Réponses: 0
    Dernier message: 26/02/2009, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo