2012-04-11 13 views
33

sembra che domanda vecchia come il mondo, ma ancora non riesce a trovare la soluzione ..test con la primavera e Maven: ApplicationContext

Sto cercando di eseguire test semplice:

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

Files sono a:

src 
    main 
     resources 
      applicationContext.xml 

e

src   
    test 
     resources 
      PersonsPopulateTest-context.xml 

Così, dopo la costruzione di questi file sono in bersaglio/classi e bersaglio/test-classi

Ma comando test mvn ancora dice: Impossibile caricare ApplicationContext

Cosa documentazione ufficiale dicono:

@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... 
} 

Dove ho sbagliato?

Grazie, Vlaidimir

UPDATE. surefire-reports:

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 
+0

È possibile visualizzare l'esatto messaggio di errore con stacktrace? – axtavt

+3

Penso che 'applicationContext.xml' debba trovarsi nel tuo' src/test/resources'. I test AFAIK non possono accedere alle cartelle 'src/main'. –

+5

@Maroe: No, i test possono accedere al classpath principale. Se non possono, come possono caricare le classi sotto test? – axtavt

risposta

10

Penso che Maven semplicemente non includesse il file XML da main/resources.

Si potrebbe provare a specificare esplicitamente cosa includere nel pom.xml.

fatemi sapere se la seguente configurazione ha funzionato:

<!-- 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> 

Questa è una cosa che uso nel tuo caso. È possibile modificare questo se non si dispone di file di proprietà da includere.

+0

Maven include tutto da 'src/test/resources' e' src/main/resources' di default. Potresti facilmente controllare questi file nel tuo target dopo 'pacchetto'. Quindi ovviamente il problema non è in questo. Suppongo solo una dichiarazione di contesto errata come indicato nel commento di Prasanna Talakanti. – GKislin

9

Il file di contesto di test è nella cartella src \ test \ resources \ spring. sono riuscito a caricare il contesto con

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

Ma di riferimento (in test-context.xml) all'applicazione-context.xml che è sotto src \ principali risorse \ \ primavera cartella fallita

sono riuscito a caricare l'applicazione al contesto, creando un ClassPathXmlApplicationContext nella classe di test con

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

Fatemi sapere se questo aiuta o potrebbe creare altri problemi.

+1

Sono riuscito a riferire l'application-context.xml in test-context.xml con

2
<!-- 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> 
0

Ho avuto lo stesso problema, tutti i file sono stati copiati con successo per bersaglio/classi e bersaglio/test-classi, ancora primavera non riusciva a trovare loro.

Problema scomparsa quando è stato esplicitamente le versioni specificate per Maven-infallibile-plug e Maven-risorse-plug in pom

+0

quali sono le versioni impostate? provo a impostare tutte le versioni di questo plugin ma non funziona ancora – herau

0

AGGIORNAMENTO: In realtà nel mio caso il problema era in Compile on Save opzione abilitata. Io uso Netbeans e l'opzione è stata impostata su For test execution only. Questo valore compila i file modificati e sostituisce le risorse con nuovi file. Tuttavia, a causa dell'utilizzo delle risorse dell'applicazione in aggiunta alle risorse di test, For test execution only genera risorse generate in modo errato nella cartella target.

Modifica Compile on Save=For test execution only

a Compile on Save=Disablerisolve il problema.

Il testo di seguito è anche corretto, ma a volte non funziona. Funzionava solo fino al riavvio dell'IDE di Netbeans. Tuttavia, i dettagli del motivo del problema sono corretti, quindi preferisco lasciare il test.


VECCHIO: Nella mia situazione che ho appContext-test.xml in src/main/resources. Quando cambio codice e lancio un test unitario (non tutti), ricompila e viene eseguito correttamente. Ma se lancio di nuovo lo stesso test di unità, fallisce con lo java.lang.IllegalStateException: Failed to load ApplicationContext.

ho cambiato pom.xml da

<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> 

a

<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> 

e ora tutti funzionano bene.

L'errore era dovuto -appContext-test.xml utilizza src/main/resources/my.properties file con un sacco di variabili come

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

che sono pieni durante una generazione. Tuttavia, se si salta testResourcesrc/main/resources, viene aggiunto target/classes/my.properties allo target/classes/my.properties così come, ad es. senza una sostituzione. Questo file ovviamente rompe il contesto.

PS: È possibile rimuovere ${project.basedir}/ - è la mia abitudine.

2

vostro contesto di applicazione deve essere incluso nel classpath e mettere *:

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

Il modo migliore per individuare il tuo xml – swapyonubuntu

3

Credo che le migliori prassi è quella di mettere il file contesto applicativo per testare PersonsPopulateTest-context.xml sotto src/test/risorse. Questo file verrà copiato nella bersaglio/test-classi e si può fare riferimento ad esso nella vostra classe di test, come di seguito:

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

} 

Se si desidera comunque fare riferimento a applicationContext.xml sotto src/main/risorse, allora è necessario includere come segue:

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

} 

ha funzionato per me.

1

Per qualche ragione, ho avuto lo stesso problema e ha funzionato quando mi sono imbattuto di prova Maven con il JDK6 invece di JDK8 (nel mio caso si tratta di un'applicazione legacy)

Se aiuta nessuno.

0

Ho affrontato lo stesso problema. Per me il test è stato eseguito correttamente tramite eclipse. Tuttavia, quando mi sono imbattuto mvn test, è stato mi dà errore: Impossibile caricare ApplicationContext

Fix: Added the src/test/resources directory to classpath of surefire plugin 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> 

Adding classpath to SureFire

Speranza che aiuta.

Problemi correlati