web-dev-qa-db-fra.com

Test avec Spring et Maven: applicationContext

Semble que la question est vieille comme le monde, mais je ne trouve toujours pas la solution ..

J'essaie de lancer un test simple:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/applicationContext.xml", "/PersonsPopulateTest-context.xml"})
@Transactional
public class PersonsPopulateTest {

Les fichiers sont à:

src
   main
      resources
           applicationContext.xml

et

src        
   test
      resources
          PersonsPopulateTest-context.xml 

Donc, après la construction de ces fichiers, vous trouverez cible/classes et cible/classes de test

Mais la commande de test mvn dit toujours: Impossible de charger ApplicationContext

Ce que disent les documents officiels:

@RunWith(SpringJUnit4ClassRunner.class)
// ApplicationContext will be loaded from "/applicationContext.xml" and "/applicationContext-test.xml"
// in the root of the classpath
@ContextConfiguration(locations={"/applicationContext.xml", "/applicationContext-test.xml"})
public class MyTest {
    // class body...
}

Où est-ce que je me suis trompé?

Merci, Vlaidimir

MISE À JOUR. rapports infaillibles:

Java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.Java:157)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.Java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.Java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.Java:321)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.Java:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.Java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.Java:290)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.Java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.Java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.Java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.Java:174)
at org.Apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.Java:53)
at org.Apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.Java:123)
at org.Apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.Java:104)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
at Java.lang.reflect.Method.invoke(Method.Java:597)
at org.Apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.Java:164)
at org.Apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.Java:110)
at org.Apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.Java:175)
at org.Apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.Java:107)
at org.Apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.Java:68)
Caused by: Java.lang.IllegalArgumentException: Can not load an ApplicationContext with a NULL 'contextLoader'. Consider annotating your test class with @ContextConfiguration.
at org.springframework.util.Assert.notNull(Assert.Java:112)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.Java:117)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.Java:148)
... 30 more
33
Vladimir Kishlaly

Je pense que Maven n'a tout simplement pas inclus le fichier XML de main/resources.

Vous pouvez essayer de spécifier explicitement ce qu'il faut inclure dans le pom.xml.

Faites-moi savoir si la configuration suivante a fonctionné:

    <!-- Add this directly after the <build>-opening tag -->
    <resources>
        <resource>
            <filtering>true</filtering>
            <directory>src/test/resources</directory>
            <includes>
                <include>**/*.properties</include>
            </includes>
            <excludes>
                <exclude>**/*local.properties</exclude>
            </excludes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>

C'est quelque chose que j'utilise dans votre cas. Vous pouvez le modifier si vous n'avez pas de fichiers de propriétés à inclure.

10
Vladimir Tsvetkov

Mon fichier de contexte de test se trouve dans le dossier src\test\resources\spring. J'ai réussi à charger le contexte avec

@ContextConfiguration(locations={"classpath:**/test-context.xml"})

Mais la référence (dans test-context.xml) à l'application-context.xml qui se trouve sous dossier src\main\resources\spring a échoué

J'ai réussi à charger le contexte d'application en créant un ClassPathXmlApplicationContext dans la classe de test avec

ClassPathXmlApplicationContext appContext=new ClassPathXmlApplicationContext(new String[]{"classpath:spring/application-context.xml","classpath:spring/model-context.xml"});

Faites-moi savoir si cela aide ou pourrait créer d'autres problèmes.

9
Ahamed Mustafa M

Je pense que la meilleure pratique consiste à placer votre fichier de contexte d'application pour tester PersonsPopulateTest-context.xml sous src/test/resources. Ce fichier sera copié dans target/test-classes et vous pouvez vous y référer dans votre classe de test comme ci-dessous:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:**/PersonsPopulateTest-context.xml"})
@Transactional
public class PersonsPopulateTest {

}

Si vous souhaitez toujours faire référence à applicationContext.xml sous src/main/resources, vous devez l'inclure comme suit:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/resources/applicationContext.xml"})
@Transactional
public class PersonsPopulateTest {

}

Ça a marché pour moi.

3
Tony Vu

votre contexte d'application doit être inclus dans classpath et mettre *:

@ContextConfiguration(locations = { "classpath:*/application-context.xml" })
2
borchvm
<!-- Add this directly after the <build>-opening tag in the your pom-->
            <testResources>
                <testResource>
                    <directory>src/test/resources</directory>
                    <filtering>true</filtering>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </testResource>
            </testResources>
2
Daniela

J'ai fait face au même problème. Pour moi, le test s'est déroulé avec succès via Eclipse. Cependant, quand j'ai couru mvn test, cela me donnait une erreur: Impossible de charger ApplicationContext

Correction: ajout du répertoire src/test/resources au chemin de classe du plugin surefire as-

<plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <configuration>
                <additionalClasspathElements>
                    <additionalClasspathElement>${project.basedir}/src/test/resources</additionalClasspathElement>
                </additionalClasspathElements>      
            </configuration>

Ajout d'un chemin de classe à SureFire

J'espère que ça aide.

1
Ambarish Hazarnis

Pour une raison quelconque, j'ai eu le même problème et cela a fonctionné lorsque j'ai exécuté le test maven avec le JDK6 au lieu de JDK8 (dans mon cas, c'est une application héritée)

Si cela aide quelqu'un.

1
lekant

J'ai eu le même problème, tous les fichiers ont été copiés avec succès dans cible/classes et cible/classes de test, encore printemps ne pouvait pas les trouver.

Le problème a disparu lorsque j'ai spécifié explicitement des versions pour maven-surefire-plugin et maven-resources-plugin in pom

0
Vladimir Sorokin

MISE À JOUR: En fait, dans mon cas, le problème était dans Compile on Save option activée. J'utilise Netbeans et l'option a été définie sur For test execution only. Cette valeur compile les fichiers modifiés et remplace les ressources par de nouveaux fichiers. Cependant, en raison de l'utilisation des ressources d'application en plus des ressources de test, For test execution only produit des ressources générées de manière incorrecte dans le dossier target.

En changeant Compile on Save=For test execution only

à Compile on Save=Disablerésout le problème.

Le texte ci-dessous est également correct, mais parfois ne fonctionne pas. Cela ne fonctionnait que jusqu'à ce que je redémarre l'IDE Netbeans. Cependant, les détails de la raison du problème sont corrects, par conséquent, je préfère quitter le test.


VIEUX: Dans ma situation, j'ai appContext-test.xml dans src/main/resources. Lorsque je change un code et lance un test unitaire (pas tous), il se recompile et s'exécute correctement. Mais si je lance à nouveau le même test unitaire, il échoue avec le Java.lang.IllegalStateException: Failed to load ApplicationContext.

J'ai changé pom.xml de

<build>
    <resources>
        <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>${project.basedir}/src/test/Java/resources</directory>
            <filtering>true</filtering>
        </testResource>
    </testResources>
</build>

à

<build>
    <resources>
        <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>${project.basedir}/src/main/resources</directory>
            <filtering>true</filtering>
        </testResource>
        <testResource>
            <directory>${project.basedir}/src/test/Java/resources</directory>
            <filtering>true</filtering>
        </testResource>
    </testResources>
</build>

et maintenant tout fonctionne bien.

ne erreur était due à appContext-test.xml les usages src/main/resources/my.properties fichier avec beaucoup de variables comme

database.url = ${database.url}
database.username = ${database.username}
database.password = ${database.password}

qui sont remplis lors d'une construction. Cependant, si vous ignorez src/main/resources dans testResource, puis my.properties est ajouté à target/classes/my.properties tel quel, par exemple. sans substitution. Ce fichier rompt bien sûr le contexte.

PS: vous pouvez supprimer ${project.basedir}/ - c'est mon truc personnalisé.

0
Alexander Volkov