2012-04-11 16 views
33

Parece que pregunta antigua como el mundo, pero todavía no puede encontrar la solución ..Prueba con Spring y Maven: applicationContext

Estoy intentando ejecutar prueba sencilla:

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

Archivos está en:

src 
    main 
     resources 
      applicationContext.xml 

y

src   
    test 
     resources 
      PersonsPopulateTest-context.xml 

Así que después de la construcción de estos archivos están en target/classes y meta/prueba-clases

Pero comando mvn test todavía dice: No se ha podido cargar Application Context

Qué documentos oficiales dicen:

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

¿Dónde me equivoqué?

Gracias, Vlaidimir

actualización. 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

¿Puede mostrar el mensaje de error exacto con stacktrace? – axtavt

+3

Creo que el 'applicationContext.xml' debe estar ubicado en su' src/test/resources'. Las pruebas AFAIK no pueden acceder a las carpetas 'src/main'. –

+5

@Maroe: No, las pruebas pueden acceder al classpath principal. Si no pueden, ¿cómo pueden cargar las clases bajo prueba? – axtavt

Respuesta

10

Creo que Maven simplemente no incluyó el archivo XML de main/resources.

Puede intentar especificar explícitamente qué incluir en el pom.xml.

Avísame si la siguiente configuración ha trabajado:

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

Esto es algo que utilizo en su caso. Puede editar esto si no tiene archivos de propiedades para incluir.

+0

Maven incluir todos desde 'src/test/resources' y' src/main/resources' de forma predeterminada. Puede comprobar fácilmente estos archivos en su destino después de 'paquete'. Entonces, obviamente, el problema no está en esto. Supongo que la declaración del contexto es incorrecta, como señaló en el comentario de Prasanna Talakanti. – GKislin

9

Mi archivo de contexto de prueba está bajo src \ test \ resources \ spring carpeta. me las arreglé para cargar el contexto con

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

Pero de referencia (en prueba-context.xml) a la aplicación-context.xml que está bajo src \ \ \ principales recursos de primavera carpeta no

me las arreglé para cargar el contexto de aplicación mediante la creación de un ClassPathXmlApplicationContext en la clase de prueba con

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

Déjame saber si esto ayuda o podría crear cualquier otro tema.

+1

Logré referir el application-context.xml en 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

he tenido el mismo problema, todos los archivos se han copiado con éxito a target/classes y meta/prueba-clases, todavía primavera no pudo encontrarlos.

problema desapareció cuando especifica explícitamente versiones de experto-segura-plugin y maven-recursos-plugin en pom

+0

¿Qué versiones configuró? Intento configurar todas las versiones de estos complementos pero aún no funciona. – herau

0

ACTUALIZADO: En realidad, en mi caso el problema fue en Compile on Save opción habilitada. Yo uso Netbeans, y la opción se configuró en For test execution only. Este valor compila archivos modificados y reemplaza recursos con archivos nuevos. Sin embargo, debido al uso de recursos de la aplicación adicionalmente a los recursos de prueba, For test execution only produce recursos generados incorrectamente en la carpeta target.

Cambio Compile on Save=For test execution only

a Compile on Save=Disablecorrige el problema.

El texto a continuación también es correcto, pero a veces no funciona. Funcionó solo hasta que reinicié Netbeans IDE. Sin embargo, los detalles del motivo del problema son correctos, por lo tanto, prefiero dejar la prueba.


VIEJO: En mi situación tengo appContext-test.xml en src/main/resources. Cuando cambio cualquier código y ejecuto una prueba unitaria (no todos) recompila y ejecuta correctamente. Pero si vuelvo a ejecutar la misma prueba unitaria, falla con el java.lang.IllegalStateException: Failed to load ApplicationContext.

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

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> 

y ahora todo fino trabajo.

El error se debió -appContext-test.xml utiliza src/main/resources/my.properties archivo con una gran cantidad de variables como

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

que se llenan durante una generación. Sin embargo, si omite src/main/resources en testResource, entonces my.properties se agrega a target/classes/my.properties como está, por ejemplo. sin una sustitución Este archivo, por supuesto, rompe el contexto.

PD: Puede eliminar ${project.basedir}/ - es mi opción personalizada.

2

su contexto de aplicación debe ser incluido en la ruta de clase y poner *:

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

La mejor manera de ubicar tu xml – swapyonubuntu

3

Creo que la mejor práctica es poner el archivo de contexto de aplicación para las pruebas de PersonsPopulateTest-context.xml bajo src/test/recursos. Este archivo se copiará en meta/prueba-clases y se puede hacer referencia a ella en su clase de prueba de la siguiente manera:

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

} 

Si todavía desea hacer referencia a applicationContext.xml bajo src/main/resources, entonces usted tiene que incluir los siguientes:

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

} 

que trabajó para mí.

1

Por alguna razón, yo tenía el mismo problema y funcionó cuando me encontré con la prueba experta JDK6 en lugar de JDK8 (en mi caso se trata de una aplicación heredada)

Si se ayuda a nadie.

0

Me enfrenté al mismo problema. Para mí, la prueba se estaba ejecutando con éxito a través de eclipse. Sin embargo, cuando me encontré mvn test, se me está dando error: Error al cargar Application Context

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

espero que ayude.

Cuestiones relacionadas